Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy数组中的意外赋值_Python_Numpy - Fatal编程技术网

Python numpy数组中的意外赋值

Python numpy数组中的意外赋值,python,numpy,Python,Numpy,我有一个有点奇怪的问题,这可能源于numpy中索引的工作方式。但出于某种原因,我似乎不明白这一点,更不用说达到我预期的行为: >>> a = np.array([['a', 'b'], ['c', 'd']], dtype='<U10') >>> a array([['a', 'b'], ['c', 'd']], dtype='<U10') >>> a[0] = ['e'] >>> a array(

我有一个有点奇怪的问题,这可能源于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')
然而:

>>> 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)
a=np.array([np.array(['a','b','l']),np.array(['c','d'])) >>>a[0]=“e” >>>a
array(['c',array(['c',d'],dtype='在上一个示例中,您创建了一个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'])])
显示屏提供有关阵列元素的信息

二维阵列 最初的示例是2d数组。它是字符串数据类型(或对象)这一事实并没有多大区别。它也可以是数字数组。您不能通过赋值来更改形状

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)
查看这些数组如何转换为列表:

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

Out[139]:[['a',b',array(['a',b',dtype=”您不能有预期的输出,因为这将是一个锯齿状数组。Numpy正在扩展您指定的单个项目列表的维度,使其成为一个数组,以保持与您初始化的
a
相同的形状。您可以使用
arr=np.array([[1],[2,3]]来测试这一点)
您将得到
数组([list([1]),list([2,3]),dtype=object)
在这一点上,您真的需要问一下为什么要使用numpy。现在它只是一个嵌套列表,具有numpy的开销,但是numpy的任何适当部分都不能在
对象上工作。
dtype您希望列表行为,用另一个列表替换列表的第一个元素。对于这个数组,赋值是实际上,
a[0,:]=['e']
,将“e”分配给0行的所有元素。我可以理解为什么您认为这很混乱,但实际上,根本原因是您误用了numpy库(我不是苛刻的意思)。这就引出了你的第二点的答案;如果你认为会发生这种情况,就不要使用numpy。只需使用常规列表。numpy不是增强的python列表;数组有特定的用途。如果你将
object
视为数据类型,那么几乎可以肯定你做错了什么。这也适用于熊猫
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)
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)
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)
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']]