从NumPy开始使用NumPy Book中的示例时,我注意到了一个示例:
a = zeros((4, 5))
b = ones(6)
add(b, b, a[1:3, 0:3].flat)
print(a)
退货
array([[0, 0, 0, 0, 0]
[2, 2, 2, 0, 0]
[2, 2, 2, 0, 0]
[0, 0, 0, 0, 0]])
但是,当我尝试此代码时,它导致以下错误:
add(b,b,a [1:3,0:3] .flat)
TypeError:返回数组必须为ArrayType”
有人可以阐明这个问题吗?
如果您有2个自变量,numpy.add
则将它们作为的两个操作数added
。如果您提供3个参数,则前两个是添加的参数,第三个是result
。那么实际上不是结果,而是应该将结果保存在其中的数组。
因此,您添加b
了b
并希望将其存储在中a[1:3, 0:3].flat
。
让我们只是尝试np.add(b, b)
这给
import numpy as np
a = np.zeros((4, 5))
b = np.ones(6)
np.add(b, b)
# returns array([ 2., 2., 2., 2., 2., 2.])
因此,现在我尝试a[1:3, 0:3].flat
返回哪个<numpy.flatiter at 0x22204e80c10>
。这意味着它返回一个,iterator
因此没有数组。但是我们不需要迭代器,而需要数组。有一种称为的方法ravel()
。所以尝试a[1:3, 0:3].ravel()
返回:
array([ 0., 0., 0., 0., 0., 0.])
所以我们有一个数组。特别是数组也可用于存储结果(相同的形状!)。所以我尝试了:
np.add(b, b, a[1:3, 0:3].ravel())
# array([ 2., 2., 2., 2., 2., 2.])
但是,让我们看看是否a
已更改:
a
#array([[ 0., 0., 0., 0., 0.],
# [ 0., 0., 0., 0., 0.],
# [ 0., 0., 0., 0., 0.],
# [ 0., 0., 0., 0., 0.]])
所以a
没有改变。那是因为ravel()
如果可能的话,它仅返回一个视图(赋值将传播到未拆散的数组),否则返回一个副本。将结果保存在副本中是毫无意义的,因为out
参数的全部意义在于该操作是就地完成的。我只是在猜测为什么要制作副本,但是我认为这是因为我们从更大的数组中取出一部分,而该部分在内存中并不连续。
因此,我建议您out
在这种情况下不要使用参数,而应使用的返回值np.add
并将其存储在的指定区域内a
:
a[1:3, 0:3] = np.add(b, b).reshape(2,3) # You need to reshape here!
a
#array([[ 0., 0., 0., 0., 0.],
# [ 2., 2., 2., 0., 0.],
# [ 2., 2., 2., 0., 0.],
# [ 0., 0., 0., 0., 0.]])
也a[1:3, 0:3].flat = np.add(b, b)
可以。
我认为这本书已经过时,可以使用较旧的numpy
版本,或者根本无法使用,这是本书中的一个错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句