2013-10-05 24 views
5

Sayım sayacıyla davranışta bulunamadığımı görüyorum. Bir 2D dizisindeki değerleri sıralı bir şekilde depolamak ve aşağıdaki davranışı görmek istiyorum. Neden dbArray ile çalışmalı ama simarray ile başarısız olur?Numune bincount 2B dizileri ile çalışabilir mi?

>>> dbArray 
array([[1, 0, 1, 0, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 0, 1, 1], 
     [1, 0, 0, 0, 0], 
     [0, 0, 0, 1, 1], 
     [0, 1, 0, 1, 0]]) 
>>> N.apply_along_axis(N.bincount,1,dbArray) 
array([[2, 3], 
     [0, 5], 
     [1, 4], 
     [4, 1], 
     [3, 2], 
     [3, 2]], dtype=int64) 
>>> simarray 
array([[2, 0, 2, 0, 2], 
     [2, 1, 2, 1, 2], 
     [2, 1, 1, 1, 2], 
     [2, 0, 1, 0, 1], 
     [1, 0, 1, 1, 2], 
     [1, 1, 1, 1, 1]]) 
>>> N.apply_along_axis(N.bincount,1,simarray) 

Traceback (most recent call last): 
    File "<pyshell#31>", line 1, in <module> 
    N.apply_along_axis(N.bincount,1,simarray) 
    File "C:\Python27\lib\site-packages\numpy\lib\shape_base.py", line 118, in apply_along_axis 
    outarr[tuple(i.tolist())] = res 
ValueError: could not broadcast input array from shape (2) into shape (3) 

cevap

7

sorun değerleri eksik olduğunda bincount hep özellikle aynı şekilli nesneleri dönen olmamasıdır.

>>> m = np.array([[0,0,1],[1,1,0],[1,1,1]]) 
>>> np.apply_along_axis(np.bincount, 1, m) 
array([[2, 1], 
     [1, 2], 
     [0, 3]]) 
>>> [np.bincount(m[i]) for i in range(m.shape[1])] 
[array([2, 1]), array([1, 2]), array([0, 3])] 

çalışır, ancak: Örneğin:

>>> m = np.array([[0,0,0],[1,1,0],[1,1,0]]) 
>>> m 
array([[0, 0, 0], 
     [1, 1, 0], 
     [1, 1, 0]]) 
>>> [np.bincount(m[i]) for i in range(m.shape[1])] 
[array([3]), array([1, 2]), array([1, 2])] 
>>> np.apply_along_axis(np.bincount, 1, m) 
Traceback (most recent call last): 
    File "<ipython-input-49-72e06e26a718>", line 1, in <module> 
    np.apply_along_axis(np.bincount, 1, m) 
    File "/usr/local/lib/python2.7/dist-packages/numpy/lib/shape_base.py", line 117, in apply_along_axis 
    outarr[tuple(i.tolist())] = res 
ValueError: could not broadcast input array from shape (2) into shape (1) 

olmaz.

Sen minlength parametresini kullanın ve bir lambda veya partial falan kullanarak geçebileceği:

>>> np.apply_along_axis(lambda x: np.bincount(x, minlength=2), axis=1, arr=m) 
array([[3, 0], 
     [1, 2], 
     [1, 2]]) 
İlgili konular