4

奇妙な小さな配列を作成するとします。

>>> a = np.array([[[1,2,3],4],[[4,5,6],5]])
>>> a
array([[[1, 2, 3], 4],
       [[4, 5, 6], 5]], dtype=object)

次に、最初の列をスライスとして取得します。

>>> b = a[:,0]
>>> b
array([[1, 2, 3], [4, 5, 6]], dtype=object)
>>> b.shape
(2,)

b の形状を (2,3) になるように変更したいとします。

>>> b.reshape((-1,3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: total size of new array must be unchanged

numpy は b の各配列を配列自体ではなくオブジェクトとして扱っていると思います。問題は、目的のサイズ変更を行う良い方法があるかどうかです。

4

2 に答える 2

3

特定の例では、 numpy.vstack を使用できます。

import numpy as np


a = np.array([[[1,2,3],4],[[4,5,6],5]])
b = a[:,0]

c = np.vstack(b)
print c.shape # (2,3)

編集:配列aは実際の行列ではなく、配列のコレクションであるため( wim が指すように)、次のこともできます。

   b = np.array([ line for line in a[:,0]])
   print b.shape #(2,3)
于 2012-10-24T13:06:46.883 に答える
2

の形状をその場で変更することはできませんがb、目的の形状のコピーを で作成しますnp.vstack(b)。とはいえ、あなたはおそらくすでにこれだけを知っていたと思います。

の最初の列で配列を作成していないことに注意してくださいa。調べるtype(a[0,0])と、実際にそこにリストがあることがわかります。つまり、スライスa[:,0]は実際には 2 つのリスト オブジェクトの列ベクトルであり、それ自体は配列ではありません (決してそうではありませんでした)。

于 2012-10-24T13:05:07.417 に答える