2013-04-11 9 views
10

のnumpyの配列の違い(より高い次元で、等、又はlistlistlistを用いて対dtype='o'numpy.arrayにPythonオブジェクトを格納する利点と欠点は何ですか?パイソン:リスト及びオブジェクト

この場合、numpy配列の方が効率的ですか? (間接指定を避けることはできないと思われますが、多次元の場合はより効率的です)。

+1

私は個人的にNumPyの*オブジェクト*アレイの魅力的な用途に遭遇したことはありません。誰かが説得力のある例を思いつくことができるかどうかを知ることは興味深いでしょう。 (+1) – NPE

+0

可能な複製http://stackoverflow.com/questions/6141853/numpy-array-of-python-objects – tiago

+2

@NPE私は、(いくつかの)数学的演算を行う便利な方法以外ではほとんど同意します。 'Fraction'オブジェクト(またはそれに類するもの)の配列は、6つのネストされた' zip'および 'map'に頼らずに使用できます。 – Jaime

答えて

6

スライスは、NumPy配列とは動作が異なります。いくつかのポイントを強調するためにThe NumPy docs devote a lengthy page on the topic.:リストのスライスが浅いコピーであるながら

  • numpyのスライスは、複数の次元
  • 介しnumpyの基本的なスライスによって生成されたすべてのアレイをスライスすることができるが、常に元の配列の図です。
  • NumPyスライスにスカラーを割り当てることができます。
  • listの項目を挿入および削除するには、スライスに異なる長さのシーケンスを割り当てますが、NumPyではエラーが発生します。

デモ:

>>> a = np.arange(4, dtype=object).reshape((2,2)) 
>>> a 
array([[0, 1], 
     [2, 3]], dtype=object) 
>>> a[:,0]    #multidimensional slicing 
array([0, 2], dtype=object) 
>>> b = a[:,0] 
>>> b[:] = True  #can assign scalar 
>>> a     #contents of a changed because b is a view to a 
array([[True, 1], 
     [True, 3]], dtype=object)  

また、numpyのアレイ(例えばfraction.Fraction)、それらをサポートするオブジェクトの配列で便利な数学的操作を提供します。

+0

申し訳ありませんが、私の前のコメントは間違っていました。 – tiago

+0

また、 'flat'、' flatten'、 'nditer'のようなnumpyヘルパーを使うことができます。 –

0

Numpyは、Pythonリストよりメモリ使用量が少ないです。また、Numpyはリストよりも高速で便利です。

たとえば、Pythonで2つのリストを追加する場合は、リスト内のすべての要素をループする必要があります。一方、Numpyでは、それらを追加するだけです。

# adding two lists in python 
sum = [] 
l1 = [1, 2, 3] 
l2 = [2, 3, 4] 
for i in range(len(l1)): 
    print sum.append(l1[i]+l2[i]) 
# adding in numpy 
a1 = np.arange(3) 
a2 = np.arange(3) 
sum2 = a1+a2 
print sum2 
+0

数字の配列について質問していませんでした。私はオブジェクトの配列について尋ねていた。そして、私は、Pythonのリストがより多くのメモリを必要としたり、より遅いことを知らない。結局のところ、それらは両方ともすぐ下の連続した配列です。 –