numpy数组中的意外赋值

2024-09-22 16:26:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有点奇怪的问题,这可能源于numpy中索引的工作方式。但出于某种原因,我似乎不明白这一点,更不用说达到我预期的行为:

>>> a = np.array([['a', 'b'], ['c', 'd']], dtype='<U10')
>>> a
array([['a', 'b'],
       ['c', 'd']], dtype='<U10')
>>> a[0] = ['e']
>>> a
array([['e', 'e'],
       ['c', 'd']], dtype='<U10')

所以我所期望的是得到

array([['e'], ['c', 'd']], dtype='<U10)

有人能给我一个提示,说明为什么这不能像我预期的那样工作,以及如何达到预期的行为吗

此外,针对罗甘约什的评论:

>>> a = np.array([np.array(['a', 'b']), np.array(['c', 'd'])])
>>> a[0] = 'e'
>>> a
array([['e', 'e'],['c', 'd']], dtype=object)

然而:

>>> a = np.array([np.array(['a', 'b', 'l']), np.array(['c', 'd'])])
>>> a[0] = 'e'
>>> a
array(['c', array(['c', 'd'], dtype='<U1')], dtype=object)

感觉有点奇怪

提前谢谢


Tags: numpyobjectnp方式评论arraydtype感觉
1条回答
网友
1楼 · 发布于 2024-09-22 16:26:10

在上一个示例中,创建了一个2元素数组。每个元素可以是任何内容—字符串、列表或数组:

In [113]: a = np.array([np.array(['a', 'b', 'l']), np.array(['c', 'd'])])
<ipython-input-113-3010d1b297e2>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
  a = np.array([np.array(['a', 'b', 'l']), np.array(['c', 'd'])])

在没有警告的情况下:

In [114]: a = np.array([np.array(['a', 'b', 'l']), np.array(['c', 'd'])],object)
     ...: 
In [115]: a.shape
Out[115]: (2,)
In [116]: a
Out[116]: 
array([array(['a', 'b', 'l'], dtype='<U1'),
       array(['c', 'd'], dtype='<U1')], dtype=object)
In [117]: a[0]
Out[117]: array(['a', 'b', 'l'], dtype='<U1')
In [118]: a[0] = ['foobar']
In [119]: a
Out[119]: array([list(['foobar']), array(['c', 'd'], dtype='<U1')], dtype=object)
In [120]: a[0] = 'foobar'
In [121]: a
Out[121]: array(['foobar', array(['c', 'd'], dtype='<U1')], dtype=object)

此数组的行为非常类似于2元素列表。事实上,我会质疑使用这样的数组而不是列表的价值

使用形状相同的数组创建对象数据类型数组可能很棘手,因为np.array会尽可能创建多维数组(如原始示例中所示)

In [133]: a = np.empty(2,object)     # 'blank' array with desired shape
In [134]: a
Out[134]: array([None, None], dtype=object)
In [135]: a[:] = [['a','b'],['c','d']]    # assign 2 lists to it
In [136]: a
Out[136]: array([list(['a', 'b']), list(['c', 'd'])], dtype=object)
In [137]: a[1] = np.array(['a','b'])     # assign an array to an element
In [138]: a
Out[138]: array([list(['a', 'b']), array(['a', 'b'], dtype='<U1')], dtype=object)

显示屏提供有关阵列元素的信息

二维阵列

最初的例子是2d数组。事实上,它是stringdtype(或object)并没有多大区别。它也可以是一个数字数组。不能通过指定更改形状

In [122]: b = np.array([['a', 'b'], ['c', 'd']], dtype='<U10')
In [123]: b
Out[123]: 
array([['a', 'b'],
       ['c', 'd']], dtype='<U10')
In [124]: b.shape
Out[124]: (2, 2)

应用常规多维数组索引规则,包括broadcasting

In [125]: b[0]
Out[125]: array(['a', 'b'], dtype='<U10')
In [126]: _.shape
Out[126]: (2,)
In [127]: b[0] = 'd'         # broadcast to the whole row
In [128]: b
Out[128]: 
array([['d', 'd'],
       ['c', 'd']], dtype='<U10')

In [129]: b[0] = ['d','e']    # assign separate elements to the row
In [130]: b
Out[130]: 
array([['d', 'e'],
       ['c', 'd']], dtype='<U10')

In [131]: b[:,1] = ['x','y']   # assign to a column
In [132]: b
Out[132]: 
array([['d', 'x'],
       ['c', 'y']], dtype='<U10')

查看这些数组如何转换为列表:

In [139]: a.tolist()
Out[139]: [['a', 'b'], array(['a', 'b'], dtype='<U1')]
In [140]: b.tolist()
Out[140]: [['d', 'x'], ['c', 'y']]

numpy针对数值多维数组进行了优化。所有快速编译的代码都在数值上工作。它可以存储字符串和一般对象,但处理速度是Python的,而不是快速编译的

相关问题 更多 >