NumPy'de nasıl boş bir dizi / matris oluşturabilirim?


311

Normalde bir liste kullanacak şekilde bir dizi veya matris nasıl kullanılacağını anlayamıyorum. Boş bir dizi (veya matris) oluşturmak ve sonra bir kerede bir sütun (veya satır) eklemek istiyorum.

Şu anda bunu yapmanın tek yolu şudur:

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

Oysa bir liste olsaydı, böyle bir şey yapardım:

list = []
for item in data:
    list.append(item)

NumPy dizileri veya matrisleri için bu tür bir gösterim kullanmanın bir yolu var mı ?

Yanıtlar:


441

NumPy'yi verimli kullanmak için yanlış zihinsel modele sahipsiniz. NumPy dizileri bitişik bellek bloklarında saklanır. Varolan bir diziye satır veya sütun eklemek istiyorsanız, dizinin tamamının yeni bir bellek bloğuna kopyalanması ve yeni öğelerin depolanması için boşluklar oluşturulması gerekir. Bir dizi oluşturmak için tekrar tekrar yapılırsa bu çok verimsizdir.

Satır eklenmesi durumunda en iyi seçeneğiniz, veri kümenizin sonunda olacağı kadar büyük bir dizi oluşturmak ve daha sonra buna satır satır veri eklemektir:

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

123
Diziyi sıfırlamanız gerekmiyorsa numpy.empty () de vardır.
janneb

21
Zero () yerine empty () kullanmanın faydası nedir?
Zach

45
verilerinizle hemen başlatacaksanız, sıfırlama maliyetinden tasarruf edersiniz.
marcorossi

16
@maracorossi böylece .empty()hücrelerde rastgele değerler bulabilirsiniz, ancak dizi örneğin .zeros()?
user3085931

6
@ user3085931 evet!
Nathan

98

NumPy dizisi bir listeden çok farklı bir veri yapısıdır ve farklı şekillerde kullanılmak üzere tasarlanmıştır. Kullanımınız hstackpotansiyel olarak çok verimsiz ... her aradığınızda, mevcut dizideki tüm veriler yeni bir veriye kopyalanır. ( appendİşlev aynı soruna sahip olacaktır.) Matrisinizi bir seferde bir sütun oluşturmak istiyorsanız, bitene kadar bir listede tutmak ve sadece bir diziye dönüştürmek en iyisi olabilir.

Örneğin


mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

itemher biri itemaynı sayıda öğeye sahip olduğu sürece bir liste, bir dizi veya yinelenebilir herhangi bir öğe olabilir.
Bu özel durumda ( datamatris sütunlarını tutan bazı yinelenebilir mi)


mat = numpy.array(data)

(Ayrıca list, değişken adı olarak kullanmanın yerleşik türü bu ada göre maskelediği için hataya yol açabileceğinden muhtemelen iyi bir uygulama olmadığını unutmayın .)

DÜZENLE:

Herhangi bir nedenden dolayı gerçekten boş bir dizi oluşturmak istiyorsanız, sadece kullanabilirsiniz numpy.array([]), ancak bu nadiren yararlıdır!


1
Numpy dizileri / matrisleri Matlab'lardan temel olarak farklı mıdır?
levesque

1
Herhangi bir nedenle ancak sabit genişlikte (örn ile boş bir dizi tanımlamak gerekirse np.concatenate()), kullanabilirsiniz: np.empty((0, some_width)). 0, yani ilk diziniz çöp olmayacak.
NumesSanguis

56

NumPy'de boş bir çok boyutlu dizi oluşturmak için (örneğin m*n, matrisinizi saklamak için bir 2D dizi ), mkaç satır ekleyeceğinizi bilmiyorsanız ve Stephen Simmons'ın bahsettiği hesaplama maliyetini umursamıyorsanız (yani her ekleme yapılması) de dizi 0 olarak size eklenecek istediğiniz kadar boyut sıkmak olabilir: X = np.empty(shape=[0, n]).

Bu şekilde örneğin kullanabilirsiniz (burada m = 5boş matrisi oluştururken bilmediğimizi varsayıyoruz ve n = 2):

import numpy as np

n = 2
X = np.empty(shape=[0, n])

for i in range(5):
    for j  in range(2):
        X = np.append(X, [[i, j]], axis=0)

print X

hangi size verecektir:

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]

1
Bu, OP # sorusunu önceden bilmediğiniz kullanım durumu için sorulan sorunun cevabı olmalı veya 0 satır olduğu davayı ele almak
istemelidir

26

Bunu çok araştırdım çünkü okul projelerimden birinde bir numpy.array kullanmam gerekiyordu ve boş olarak başlatılmalıydım ... Burada Stack Overflow'da ilgili bir cevap bulamadım, bu yüzden başladım bir şey doodling.

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

Sonuç:

In [34]: x
Out[34]: array([], dtype=float64)

Bu nedenle bir np dizisini doğrudan şu şekilde başlatabilirsiniz:

In [36]: x= np.array([], dtype=np.float64)

Umarım bu yardımcı olur.


Bu, sorudaki gibi diziler için işe yaramaz, ancak vektörler için yararlı olabilir.
divenex

a=np.array([])varsayılan olarak görünüyorfloat64
P i

7

Append fonksiyonunu kullanabilirsiniz. Satırlar için:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

Sütunlar için:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

EDIT
Tabii ki, diğer cevaplarda belirtildiği gibi, matris / dizi üzerinde bazı işlemler (örn. Ters çevirme) yapmadığınız sürece dizi.


3

Dizinin son boyutunu kesinlikle bilmiyorsanız, dizinin boyutunu şu şekilde artırabilirsiniz:

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • 0İlk satırda dikkat edin .
  • numpy.appendbaşka bir seçenektir. Çağırır numpy.concatenate.

3

Sıfırlar gibi herhangi bir dizi oluşturmak için uygulayabilirsiniz:

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]

4
Bunu saf a= [0] * 5
python'da

3

İşte numpys'in Listeler gibi görünmesini sağlamak için bazı geçici çözümler

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

ÇIKTI: dizi ([2., 24.])


2

Bunu ne için kullandığınıza bağlı olarak, veri türünü belirtmeniz gerekebilir (bkz. 'Dtype' ).

Örneğin, 8 bitlik bir 2B dizi oluşturmak için (tek renkli görüntü olarak kullanılmaya uygundur):

myarray = numpy.empty(shape=(H,W),dtype='u1')

RGB görüntü için şekildeki renk kanallarının sayısını ekleyin: shape=(H,W,3)

Kullanmak numpy.zerosyerine ile sıfır başlatmayı da düşünebilirsiniz numpy.empty. Buradaki nota bakın .


1

Çalışmaların çoğunu listelerle işlemek ve sonucu matris olarak kullanmak istediğinizi düşünüyorum. Belki de bu bir yoldur;

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)

1

Sanırım boş numpy dizi gibi oluşturabilirsiniz:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

Döngüdeki numpy dizisini eklemek istediğinizde bu biçim yararlıdır.


0

Şeklini tanımlamadan boş bir NumPy dizisi oluşturmak için yol vardır:

1.

arr = np.array([]) 

tercihli. çünkü bunu numpy olarak kullanacağınızı biliyorsunuz.

2.

arr = []
# and use it as numpy. append to it or etc..

NumPy bunu daha sonra ekstra olmadan np.ndarray türüne dönüştürür [] dimionsion.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.