2016-04-11 24 views
1

Nümerik bir diziyi önceden ayırmanın ne kadar önemli olduğunu okudum. Benim durumumda, ancak bunu nasıl yapacağımı bilmiyorum. Bir nxm matrisini önceden tahsis etmek istiyorum. Bu, kulağa matris matrisi matrisiyse ne olur? Peki bu nxm öğelerin her formdaNümerik dizilerin numpy dizisinin ön ayrımı

np.array([[t], [x0,x1,x2], [y0,y1,y2]]) 

aslında olup olmadığını bu durumda, M şekle sahip olacağını biliyorum (n, m, 3). Örnek olarak, daha sonra ben sadece

M = np.zeros((2,2,3)) 

ama sonra

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

bana bir hata

ValueError: setting an array element with a sequence.

verecektir yapıyor denedim bu

[[[[0], [0,1,2], [3,4,5]], 
    [[1], [10,11,12], [13,14,15]]], 
[[[0], [100,101,102], [103,104,105]], 
    [[1], [110,111,112], [113,114,115]]]] 

gibi bir şey olsun istiyorum

Ca n Bu canavarı preallocate etmiyorum? Yoksa buna tamamen farklı bir şekilde yaklaşmalı mıyım? Yardımlarınız

+0

Örnekleriniz işe yaramayacaktır çünkü 'np.array' çağrılarında '[] 'seçeneğini eklemeyi unutmuşsunuzdur. Ayrıca, tanımlanmamış değişkenler yerine gerçek rakamlar kullanın, bu yüzden ne istediğinizi görmek daha kolay. Şu anda 't' x000''in her biri bir sayı ya da numpy dizisi ya da tamamen başka bir şey olabilir. Ayrıca bakınız: [mcve] – MSeifert

+0

Teşekkürler, '[]' maalesef eksik olan şey değil. Örneği düzenledim ve ayrıca M.shape = (m, n, 3) 'e ihtiyacım olduğunu da keşfettim. Ama hala işe yaramayacak. – grinsbaeckchen

+0

Neden sadece dizilerde bir liste toplamak değil? – hpaulj

cevap

0

Doldurmak için basit atamaları kullanmak için her boyutta doğru boyut ve öğe sayısını önceden ayırdığınızdan emin olmanız gerekir.

Örneğin 3 2x3 matrisleri kaydetmek istiyorum:

number_of_matrices = 3 
matrix_dim_1 = 2 
matrix_dim_2 = 3 

M = np.empty((number_of_matrices, matrix_dim_1, matrix_dim_2)) 
M[0] = np.array([[ 0, 1, 2], [ 3, 4, 5]]) 
M[1] = np.array([[100, 101, 102], [103, 104, 105]]) 
M[2] = np.array([[ 10, 11, 12], [ 13, 14, 15]]) 

M 
#array([[[ 0., 1., 2.],   # matrix 1 
#  [ 3., 4., 5.]], 
# 
#  [[ 100., 101., 102.],   # matrix 2 
#  [ 103., 104., 105.]], 
# 
#  [[ 10., 11., 12.],   # matrix 3 
#  [ 13., 14., 15.]]]) 

Sen yaklaşım bazı sorunlar içeriyor konum.

np.array([[0], [0,1,2], [3,4,5]]) 
# array([[0], [0, 1, 2], [3, 4, 5]], dtype=object) 
#         |----!!----| 
#   ^-------^----------^  3 items in first dimension 
#  ^      1 item in first item of 2nd dim 
#    ^--^--^    3 items in second item of 2nd dim 
#       ^--^--^ 3 items in third item of 2nd dim  

Sadece Python list nesneleri içeren bir 3 öğe dizisi oluşturur: Kaydetmek istediğiniz dizisi geçerli bir n-boyutlu numpy dizi değil. Büyüklüklere dikkat etmeniz gereken büyük olasılıkla sayı içeren bir diziye sahip olmak istersiniz. np.array([[0], [0,1,2], [3,4,5]]), 3x1 dizisi veya 3x3 dizisi olabilir, numpy bu durumda ne yapacağını bilmez ve nesneler olarak kaydeder (dizi artık sadece 1 boyuta sahiptir!).


diğer sorun

Birden fazla eleman içeren başka dizi önceden tahsis edilen alanlara dizinin bir elemanını ayarlamak istediğiniz olmasıdır. Bu mümkün değildir (zaten bir object-diziniz var). dizinin gerektirdiği şekilde önceden tahsis edilen alanlara dizideki

  1. Dolgu gibi birçok unsurları: önerilmez

    M[0, :, :] = np.array([[0,1,2], [3,4,5]]) 
    # ^--------------------^--------^  First dimension has 2 items 
    #  ^---------------^-^-^   Second dimension has 3 items 
    #  ^------------------------^-^-^ dito 
    # if it's the first dimension you could also use M[0] 
    
  2. bir object dizi oluşturma ve (eleman ayarlamak sen Burada iki seçeneğiniz var gevşek numpy diziler) avantajlarından en:

    M = np.empty((3), dtype='object') 
    M[0] = np.array([[0,1,2], [3,4,5]]) 
    M[1] = np.array([[0,1,2], [3,4,5]]) 
    M[2] = np.array([[0,1,2], [3,4,5]]) 
    M 
    #array([array([[0, 1, 2], 
    #    [3, 4, 5]]), 
    #  array([[0, 1, 2], 
    #    [3, 4, 5]]), 
    #  array([[0, 1, 2], 
    #    [3, 4, 5]])], dtype=object) 
    
+0

Tamam, sanırım tüm problemimi yeniden düşünmek zorundayım, böylece yukarıdakilerden kaçınılmalıdır. Belki de, sadece t, x'in, bir dizi dizinin yerine bir dizide saklanır ve onları daha sonra onlara daha sonra ihtiyaç duyduğum bir bölüme ayırırım. – grinsbaeckchen

+0

@grinsbaeckchen - Dizinin bir parçası olarak t yapmanın bir sebebi var mı? Dizinin sadece meta-verileri gibi görünüyor. – MSeifert

+0

Evet, daha sonraki bir aşamada, ´x´s ve ´y´lerin karşılık gelenleriyle birlikte çalışmam gerekiyor. Ve onlara ayrı bir dizide değil, birlikte ihtiyacım var. Bununla birlikte, bir matrise ihtiyaç duymadığımı anladım, bir dizi/liste ihtiyaçlarım için yeterli. Bu işleri biraz kolaylaştırır. Şimdi bir np.array yerine bir liste kullandım. Bu daha yavaş olabilir, ancak şu an için çalışıyor. – grinsbaeckchen

0

için

sayesinde size sadece mağaza değerleri t, y, xn,m her bir nokta için o zaman, daha kolay ve daha hızlı hesaplama olabilir olacak üç numpy diziler var biliyorsanız.

Yani:

M_T = np.zeros((n,m)) 
M_Y = np.zeros((n,m)) 
M_X = np.zeros((n,m)) 

Sana şimdi yapmak 'normal' piton operatörleri yazabilirsiniz inanıyoruz dizi mantık, örneğin:

MX = np.ones((n,m)) 
MY = np.ones((n,m)) 
MT = MX + MY 
MT ** MT 
_ * 7.5 

(MATLAB'a benzer) dizi dostu işlevleri tanımlayarak Hesaplamalar için büyük bir hız artışı elde edeceksiniz.

Tabii ki, her noktada daha fazla değişkene ihtiyacınız varsa, bu durum hantal hale gelebilir.

+0

Oops sonra bir liste ile gittim, ben gerçekten senin soruya cevap vermedi farkettim. Doh – dodell