为什么这段代码不起作用?我无法让这个numpy数组正确调整大小。
import numpy
a = numpy.zeros((10,10))
a[3,2] = 8
a.resize((5,5))
if a[3,2] == 8:
print "yay"
else:
print "not working"
raw_input()
答案 0 :(得分:6)
来自文档[help(a.resize)
]:
Shrinking an array: array is flattened (in the order that the data are
stored in memory), resized, and reshaped:
>>> a = np.array([[0, 1], [2, 3]], order='C')
>>> a.resize((2, 1))
>>> a
array([[0],
[1]])
在您的情况下,[3,2]
在被视为展平数据列表时存储在索引32处:
>>> a = numpy.zeros((10,10))
>>> a[3,2] = 8
>>> list(a.flat).index(8)
32
32> = 25,因此您的更改无法在调整大小后继续存在。如果您只想保留一些值,则可以使用
>>> a = a[:5, :5]
>>> a
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 8., 0., 0.],
[ 0., 0., 0., 0., 0.]])
>>> a[3,2]
8.0
或者如果您真的想要,可以在调整大小之前复制数据:
>>> a = numpy.zeros((10,10))
>>> a[3,2] = 8
>>> a.flat[:(5*5)] = a[:5, :5].flat
>>> a.resize((5,5))
>>> a[3,2]
8.0
但我不太明白这一点。 [我不记得调整大小如何处理内存,但我不担心。]
答案 1 :(得分:2)
从文档中http://docs.scipy.org/doc/numpy/reference/generated/numpy.resize.html
numpy.resize(a,new_shape)
返回具有指定形状的新数组。
如果新数组大于原始数组,则新数组将填充a的重复副本。请注意,此行为与a.resize(new_shape)不同,后者填充零而不是a的重复副本。
对于您期望的行为,您需要手动复制您希望新数组保留的值,例如
a=a[:5,:5]