0

このコードが機能しないのはなぜですか?この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()
4

2 に答える 2

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

しかし、私は要点がよくわかりません。[サイズ変更がメモリをどのように処理するか思い出せませんが、心配する必要はありません。]

于 2012-12-22T21:47:57.090 に答える
2

ドキュメントからhttp://docs.scipy.org/doc/numpy/reference/generated/numpy.resize.html

numpy.resize(a, new_shape)

指定された形状の新しい配列を返します。

新しい配列が元の配列よりも大きい場合、新しい配列には a のコピーが繰り返されます。この動作は、a.resize(new_shape) とは異なることに注意してください。

あなたが期待している動作のために、新しい配列に保持させたい値を手動でコピーする必要があります。

a=a[:5,:5]
于 2012-12-22T21:58:21.443 に答える