ような配列がするかどうかをテストするための簡単な方法役立つことはnp.array
にリストのリストをラップすることです:
In [767]: mat = np.array([[[1,8,9],[1,2],[],[]],
...: [[8],[],[4,5],[9,1]],
...: [[],[7,1,4],[],[2,1,3]]])
In [768]: mat
Out[768]:
array([[list([1, 8, 9]), list([1, 2]), list([]), list([])],
[list([8]), list([]), list([4, 5]), list([9, 1])],
[list([]), list([7, 1, 4]), list([]), list([2, 1, 3])]], dtype=object)
In [769]: mat.shape
Out[769]: (3, 4)
結果は、(3,4)、オブジェクトDTYPE配列です。これは、オブジェクトdtype配列(np.empty((3,4),object)
から始まるものがより一般的です)を作る最も信頼できる方法ではありませんが、この場合はうまくいきます。
しかし、このような配列は、元のリストのリストに比べて多くの利点を持っていません。より高速なアレイ操作のほとんどは機能しません。ほとんどのタスクでは、リスト要素に対してPythonレベルの反復処理が必要です。
私は手段を取るために、たとえば、反復するnp.vectorize
を使用することができます。
In [775]: np.vectorize(np.mean)(mat)
/usr/local/lib/python3.5/dist-packages/numpy/core/fromnumeric.py:2909: RuntimeWarning: Mean of empty slice.
out=out, **kwargs)
/usr/local/lib/python3.5/dist-packages/numpy/core/_methods.py:80: RuntimeWarning: invalid value encountered in double_scalars
ret = ret.dtype.type(ret/rcount)
Out[775]:
array([[ 6. , 1.5, nan, nan],
[ 8. , nan, 4.5, 5. ],
[ nan, 4. , nan, 2. ]])
それは空のリストの平均を取って好きではありません。[]
をより適切に処理する簡単な関数を書くことができます。
私はアレイ(otypes
の使用を注意してください)にリストを回すことができる:私はこれは非常に私たちを買うかわからないけれども
In [777]: arr = np.vectorize(np.array,otypes=[object])(mat)
In [778]: arr
Out[778]:
array([[array([1, 8, 9]), array([1, 2]), array([], dtype=float64),
array([], dtype=float64)],
[array([8]), array([], dtype=float64), array([4, 5]), array([9, 1])],
[array([], dtype=float64), array([7, 1, 4]),
array([], dtype=float64), array([2, 1, 3])]], dtype=object)
。
あなたはNumpyアレイでこれをしたいのですか?ナンシーアレイは一様であると考えられています。 IMHO、あなたはこのタスクのためにPythonリストを使用する必要があります。 –
実際には配列を使うことは可能ですが、非常に非効率です。全体の質問は[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように聞こえます。この部分行列連結で何を達成しようとしていますか? – kazemakase
実際、3x4配列はマップの一種であり、これらの値を正しい位置に格納して、各位置で多かれ少なかれ類似しているかどうかを確認したいのです。最後に、各セルで平均をとってみたいので、3×4の配列を残しておきます。 –