我正在尝试学习nditer以可能用于加速我的应用程序。在这里,我尝试制作一个有趣的重塑程序,该程序将采用大小为 20 的数组并将其重塑为 5x4 数组:
myArray = np.arange(20)
def fi_by_fo_100(array):
offset = np.array([0, 4, 8, 12, 16])
it = np.nditer([offset, None],
flags=['reduce_ok'],
op_flags=[['readonly'],
['readwrite','allocate']],
op_axes=[None, [0,1,-1]],
itershape=(-1, 4, offset.size))
while not it.finished:
indices = np.arange(it[0],(it[0]+4), dtype=int)
info = array.take(indices)
'''Just for fun, we'll perform an operation on data.\
Let's shift it to 100'''
info = info + 81
it.operands[1][...]=info
it.iternext()
return it.operands[1]
test = fi_by_fo_100(myArray)
>>> test
array([[ 97, 98, 99, 100]])
显然,程序将每个结果都覆盖到一行中。所以我尝试使用nditer的索引功能,但仍然没有骰子。
flags=['reduce_ok','c_iter']
--> it.operands[1][it.index][...]=info
=
IndexError: index out of bounds
flags=['reduce_ok','c_iter']
--> it.operands[1][it.iterindex][...]=info
=
IndexError: index out of bounds
flags=['reduce_ok','multi_iter']
--> it.operands[1][it.multi_index][...]=info
=
IndexError: index out of bounds
it[0][it.multi_index[1]][...]=info
=
IndexError: 0-d arrays can't be indexed
...等等。我错过了什么?提前致谢。
奖金问题
我刚刚在 nditer 上看到了这篇不错的文章。我可能是 Numpy 的新手,但这是我第一次看到 Numpy 速度基准如此落后。我的理解是人们选择 Numpy 是因为它的数值速度和能力,但迭代是其中的一部分,不是吗?如果它这么慢,那么 nditer 有什么意义?