2014-10-21 2 views
9

Может кто-нибудь объяснить мне, почему попытка №1 не работает?Назначение значений массиву NumPy

import numpy as np  
x = np.zeros(1, dtype=np.dtype([('field', '<f8', (1,2))])) 

Попытка # 1:

x[0]['field'] = np.array([3.,4.], dtype=np.double) 
print x, '\n' 

[([[ 3. 0.]])] (почему только '3' скопированы?)

Попытка # 2:

x['field'][0] = np.array([3.,4.], dtype=np.double) 
print x 

[([[ 3. 4.]])] (это работает)

+1

Это похоже на проблему с '__setitem __()', потому что 'x [0:] ['field'] = ...' работает! Даже 'x [0: 999999] ['field'] = ...', используя очень высокие индексы, которые просто игнорируются ... –

ответ

2

Чтобы быть честным ... Я не уверен, что я получаю результаты либо. Это кажется непоследовательным/сломанным. Часть из-за несогласованных форм, но не всех. Некоторые данные, похоже, исчезают.

Например (обратите внимание на формы):

In [1]: import numpy as np 

In [2]: x = np.zeros(1, dtype=np.dtype([('field', '<f8', (1, 2))])) 

In [3]: y = x[0]['field'].copy() 

In [4]: y[0] = 3 

In [5]: y[1] = 4 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-5-cba72439f97c> in <module>() 
----> 1 y[1] = 4 

IndexError: index 1 is out of bounds for axis 0 with size 1 

In [6]: y[0][1] = 4 

In [7]: x 
Out[7]: 
array([([[0.0, 0.0]],)], 
     dtype=[('field', '<f8', (1, 2))]) 

In [8]: y 
Out[8]: array([[ 3., 4.]]) 

In [9]: x[0]['field'] = y 

In [10]: x 
Out[10]: 
array([([[3.0, 0.0]],)], 
     dtype=[('field', '<f8', (1, 2))]) 

Так ... чтобы было легче понять, давайте сделать форму проще.

In [1]: import numpy as np 

In [2]: x = np.zeros(1, dtype=np.dtype([('field', '<f8', 2)])) 

In [3]: y = x[0]['field'].copy() 

In [4]: y[0] = 3 

In [5]: y[1] = 4 

In [6]: x[0]['field'] = y 

In [7]: x 
Out[7]: 
array([([3.0, 0.0],)], 
     dtype=[('field', '<f8', (2,))]) 

In [8]: y 
Out[8]: array([ 3., 4.]) 

Если данные идут в этом случае ... не ключ. Назначение таким образом, что данные могут быть сохранены, кажется легко возможным.

Несколько вариантов:

In [9]: x['field'][0] = y 

In [10]: x 
Out[10]: 
array([([3.0, 4.0],)], 
     dtype=[('field', '<f8', (2,))]) 

In [11]: x['field'] = y * 2 

In [12]: x 
Out[12]: 
array([([6.0, 8.0],)], 
     dtype=[('field', '<f8', (2,))]) 

In [13]: x['field'][:] = y 

In [14]: x 
Out[14]: 
array([([3.0, 4.0],)], 
     dtype=[('field', '<f8', (2,))]) 

In [15]: x[0]['field'][:] = y * 2 

In [16]: x 
Out[16]: 
array([([6.0, 8.0],)], 
     dtype=[('field', '<f8', (2,))]) 
2

Это, как представляется, в Numpy признанным bug. Существует дискуссия о возможных исправлениях, но ошибка остается открытой.

Смежные вопросы