80

最小限の作業例として、2D 配列をデジタル化してみましょう。numpy.digitize1D 配列が必要です。

import numpy as np
N = 200
A = np.random.random((N, N))
X = np.linspace(0, 1, 20)
print np.digitize(A.ravel(), X).reshape((N, N))

ドキュメントには次のように書かれています:

... コピーは必要な場合にのみ作成されます。

ravelこの場合、コピーが「必要」かどうかはどうすればわかりますか? 一般に、特定の操作がコピーまたはビューを作成するかどうかを判断できる方法はありますか?

4

2 に答える 2

86

この質問は、私がしばらく前に尋ねた質問と非常によく似ています。

属性を確認できbaseます。

a = np.arange(50)
b = a.reshape((5, 10))
print (b.base is a)

しかし、それは完璧ではありません。を使用してメモリを共有しているかどうかを確認することもできますnp.may_share_memory

print (np.may_share_memory(a, b))

確認できる flags 属性もあります。

print (b.flags['OWNDATA'])  #False -- apparently this is a view
e = np.ravel(b[:, 2])
print (e.flags['OWNDATA'])  #True -- Apparently this is a new numpy object.

しかし、この最後のものは私には少し怪しいように思えますが、その理由についてはよくわかりません...

于 2012-07-17T14:30:03.857 に答える
21

reshapeのドキュメントには、ビューを作成できない場合に例外を確実にする方法に関する情報がいくつかあります。

データをコピーせずに配列の形状を変更できるとは限りません。データがコピーされた場合にエラーを発生させたい場合は、配列の shape 属性に新しい形状を割り当てる必要があります。

>>> a = np.zeros((10, 2))
# A transpose make the array non-contiguous
>>> b = a.T
# Taking a view makes it possible to modify the shape without modiying the
# initial object.
>>> c = b.view()
>>> c.shape = (20)
AttributeError: incompatible shape for a non-contiguous array



これはあなたの質問に対する正確な答えではありませんが、場合によっては同じように役立つかもしれません。

于 2013-01-11T03:40:59.530 に答える