Python NumPy没有正确调整大小

Ale*_* K. 0 python arrays resize numpy

为什么这段代码不起作用?我无法让这个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()
Run Code Online (Sandbox Code Playgroud)

DSM*_*DSM 6

来自docs [ 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]])
Run Code Online (Sandbox Code Playgroud)

在您的情况下,[3,2]当被视为展平数据列表时,将存储在索引32处:

>>> a = numpy.zeros((10,10))
>>> a[3,2] = 8
>>> list(a.flat).index(8)
32
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

或者如果您真的想要,可以在调整大小之前复制数据:

>>> 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
Run Code Online (Sandbox Code Playgroud)

但我不太明白这一点.[我不记得调整大小如何处理内存,但我不担心.]