MCPcopy Create free account
hub / github.com/numpy/numpy / PyArray_Broadcast

Function PyArray_Broadcast

numpy/core/src/multiarray/iterators.c:1161–1242  ·  view source on GitHub ↗

Adjust dimensionality and strides for index object iterators --- i.e. broadcast */ NUMPY_API*/

Source from the content-addressed store, hash-verified

1159*/
1160/*NUMPY_API*/
1161NPY_NO_EXPORT int
1162PyArray_Broadcast(PyArrayMultiIterObject *mit)
1163{
1164 int i, nd, k, j;
1165 int src_iter = -1; /* Initializing avoids a compiler warning. */
1166 npy_intp tmp;
1167 PyArrayIterObject *it;
1168
1169 /* Discover the broadcast number of dimensions */
1170 for (i = 0, nd = 0; i < mit->numiter; i++) {
1171 nd = PyArray_MAX(nd, PyArray_NDIM(mit->iters[i]->ao));
1172 }
1173 mit->nd = nd;
1174
1175 /* Discover the broadcast shape in each dimension */
1176 for (i = 0; i < nd; i++) {
1177 mit->dimensions[i] = 1;
1178 for (j = 0; j < mit->numiter; j++) {
1179 it = mit->iters[j];
1180 /* This prepends 1 to shapes not already equal to nd */
1181 k = i + PyArray_NDIM(it->ao) - nd;
1182 if (k >= 0) {
1183 tmp = PyArray_DIMS(it->ao)[k];
1184 if (tmp == 1) {
1185 continue;
1186 }
1187 if (mit->dimensions[i] == 1) {
1188 mit->dimensions[i] = tmp;
1189 src_iter = j;
1190 }
1191 else if (mit->dimensions[i] != tmp) {
1192 set_shape_mismatch_exception(mit, src_iter, j);
1193 return -1;
1194 }
1195 }
1196 }
1197 }
1198
1199 /*
1200 * Reset the iterator dimensions and strides of each iterator
1201 * object -- using 0 valued strides for broadcasting
1202 * Need to check for overflow
1203 */
1204 tmp = PyArray_OverflowMultiplyList(mit->dimensions, mit->nd);
1205 if (tmp < 0) {
1206 PyErr_SetString(PyExc_ValueError,
1207 "broadcast dimensions too large.");
1208 return -1;
1209 }
1210 mit->size = tmp;
1211 for (i = 0; i < mit->numiter; i++) {
1212 it = mit->iters[i];
1213 it->nd_m1 = mit->nd - 1;
1214 it->size = tmp;
1215 nd = PyArray_NDIM(it->ao);
1216 if (nd != 0) {
1217 it->factors[mit->nd-1] = 1;
1218 }

Callers 1

multiiter_new_implFunction · 0.85

Calls 5

PyArray_NDIMFunction · 0.85
PyArray_DIMSFunction · 0.85
PyArray_STRIDESFunction · 0.85

Tested by

no test coverage detected