![](/img/trans.png)
[英]Zero-dimensional arrays cannot be concatenated, but my arrays aren't zero-dimensional
[英]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.