簡體   English   中英

為什么記錄中的零維numpy數組不支持項目分配?

[英]Why don't zero-dimensional numpy arrays in records support item assignment?

首先,可以分配一個形狀(4,) numpy數組:

In [33]: a = np.zeros((10,), dtype=[('k', '<u8'), ('t', '<f4'), ('d', np.bool, (4,))])

In [34]: b = np.ones((), dtype=np.bool)

In [35]: a[0][2][3] = b

但是,形狀()如果在記錄中,則不能:

In [36]: a = np.zeros((10,), dtype=[('k', '<u8'), ('t', '<f4'), ('d', np.bool, ())])

In [37]: a[0][2][()] = b
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-37-075e4ba95b60> in <module>()
----> 1 a[0][2][()] = b

TypeError: 'numpy.bool_' object does not support item assignment

但是,如果它不在記錄中,它就可以正常工作:

In [38]: a = np.zeros((), np.bool)

In [39]: a[()] = b

為什么?


記錄類型如下所示:

In [4]: a
Out[4]:
array([(0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False]),
       (0,  0., [False, False, False, False])],
      dtype=[('k', '<u8'), ('t', '<f4'), ('d', '?', (4,))])

In [2]: a
Out[2]:
array([(0,  0., False), (0,  0., False), (0,  0., False), (0,  0., False),
       (0,  0., False), (0,  0., False), (0,  0., False), (0,  0., False),
       (0,  0., False), (0,  0., False)],
      dtype=[('k', '<u8'), ('t', '<f4'), ('d', '?')])

第一個例子:

a = np.zeros((10,), dtype=[('k', '<u8'), ('t', '<f4'), ('d', np.bool, (4,))])

創建一維numpy數組,其中每個元素都包含Tuple(_, _, List[np.bool])

索引a[0]引用:

(0,  0., [False, False, False, False])

因此, a[0][2][3]引用下面**中的np.bool

(0,  0., [False, False, False, **False**])

並按照您的期望行事。

第二個例子:

a = np.zeros((10,), dtype=[('k', '<u8'), ('t', '<f4'), ('d', np.bool, ())])

創建一個一維的numpy數組,其中每個元素包含Tuple(_, _, np.bool)例如

(0,  0., False)

因此, a[0][2]引用:

(0, 0., **False**)

第三個索引a[0][2]**[()]**作用於np.bool對象,該對象不可索引。

引發相同錯誤的簡化示例如下所示:

a = [False]
a[0] = True    # works
a = True       # changed type from [bool] to bool
a[0] = True    # Fails b/c bools are not scriptable

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bool' object does not support item assignment
array([(0,  0., False), (0,  0., False), (0,  0., False), (0,  0., False),
       (0,  0., False), (0,  0., False), (0,  0., False), (0,  0., False),
       (0,  0., False), (0,  0., False)],
      dtype=[('k', '<u8'), ('t', '<f4'), ('d', '?')])

請注意, ('d', '?')與將字段定義為('d', np.bool)

以我自己的例子

In [621]: x = np.ones((3,),dtype=[('f0',int),('f1',int,()),('f2',int,(1,))])
In [622]: x
Out[622]: 
array([(1, 1, [1]), (1, 1, [1]), (1, 1, [1])],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4', (1,))])

“ f0”和“ f1”的索引方式相同; 它們具有相同的描述(名稱除外)。 np.dtype構造函數已剝離或忽略了()

In [623]: x['f0']=np.arange(3)
In [624]: x['f1']=np.arange(3)
In [625]: x['f2']=np.arange(3)
....
ValueError: could not broadcast input array from shape (3) into shape (3,1)

因此,如果有的話,問題不在於索引,而在於dtype忽略了描述符的()部分。


在第一種情況下,可以使用三重索引或2d索引訪問“ d”字段:

In [649]: a['d'].shape
Out[649]: (10, 4)
In [650]: a[0]['d'][3]
....
In [651]: a['d'][0,3]

我的x['f1']字段為'()'仍為1d

In [652]: x['f1'].shape
Out[652]: (3,)
In [653]: x['f2'].shape
Out[653]: (3, 1)

我想不出一種有意義的方式來創建或索引0d維度。 我們不需要(3,0)形狀,也不能具有(3,()) shape or [:,()]`索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM