Python 将数组的维度从 (n,1) 更改为 (n,)
Python change the array's dimension from (n,1) for (n,)
如果我声明一个形状为 (3,100) 的数组“v”,当我想逐列更改其值时使用“for” python 更改“v[:,i ]" 对于 (3,) 这很烦人,我无法进行更改,因为在左侧成员它有一个 (3,) 数组,而在右侧,它有一个 (3,1) 数组。
我想知道,为什么会这样?我有哪些应对方案?
谢谢。
v = np.ones( (3, 100) );
for i in range( 0 , 100 ):
v[:,i] = np.array([[1],
[2],
[3]])
ValueError: could not broadcast input array from shape (3,1) into shape (3)
我想你问的是:如何按列设置它们。
v = np.ones( (3,100) )
for i in range( 0 , 100 ):
v[:,i] = np.array([1,
3,
2])
所做的更改是删除作业中的额外括号。
如果你想做其他事情,你可以尝试对行做,然后横向翻转数组:
v = np.ones((100,3))
for i in range(0,100):
v[i] = np.array([1,3,2])
编辑:将空格更改为与作者相同
In [379]: M = np.arange(12).reshape(3,4)
使用标量进行索引将维度减少了一个。这是索引的基本规则 - 在 numpy
和 python
.
中
In [380]: M[0,:]
Out[380]: array([0, 1, 2, 3])
In [381]: M[:,0]
Out[381]: array([0, 4, 8])
列表相同:
In [383]: M.tolist()
Out[383]: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
In [384]: M.tolist()[0]
Out[384]: [0, 1, 2, 3]
具有 list/array 或切片的索引确实保留了维度:
In [385]: M[:,[0]]
Out[385]:
array([[0],
[4],
[8]])
因此将 (3,) 分配给 (3,) 插槽就可以了:
In [386]: M[:,0] = [10,20,30]
将 (3,1) 分配给该插槽会产生错误:
In [387]: M[:,0] = [[10],[20],[30]]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
<ipython-input-387-1bbfa6dfa93c> in <module>
----> 1 M[:,0] = [[10],[20],[30]]
ValueError: setting an array element with a sequence.
In [388]: M[:,0] = np.array([[10],[20],[30]]) # or with an array
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-388-6e511ffdc44e> in <module>
----> 1 M[:,0] = np.array([[10],[20],[30]])
ValueError: could not broadcast input array from shape (3,1) into shape (3)
通过广播 (3,) 可以进入 (1,3),但不能 (3,1) 进入 (3,)。一种解决方案是展平 RHS:
In [389]: M[:,0] = np.array([[10],[20],[30]]).ravel()
分配给 (3,1) 插槽也有效:
In [390]: M[:,[0]] = np.array([[10],[20],[30]])
In [391]: M[:,0:1] = np.array([[10],[20],[30]])
我们也可以将 (3,1) 转置为 (1,3)。或者分配给 M[:,0][:,None]
或 M[:,0,None]
(两者都创建一个 (3,1))。
如果我声明一个形状为 (3,100) 的数组“v”,当我想逐列更改其值时使用“for” python 更改“v[:,i ]" 对于 (3,) 这很烦人,我无法进行更改,因为在左侧成员它有一个 (3,) 数组,而在右侧,它有一个 (3,1) 数组。
我想知道,为什么会这样?我有哪些应对方案?
谢谢。
v = np.ones( (3, 100) );
for i in range( 0 , 100 ):
v[:,i] = np.array([[1],
[2],
[3]])
ValueError: could not broadcast input array from shape (3,1) into shape (3)
我想你问的是:如何按列设置它们。
v = np.ones( (3,100) )
for i in range( 0 , 100 ):
v[:,i] = np.array([1,
3,
2])
所做的更改是删除作业中的额外括号。
如果你想做其他事情,你可以尝试对行做,然后横向翻转数组:
v = np.ones((100,3))
for i in range(0,100):
v[i] = np.array([1,3,2])
编辑:将空格更改为与作者相同
In [379]: M = np.arange(12).reshape(3,4)
使用标量进行索引将维度减少了一个。这是索引的基本规则 - 在 numpy
和 python
.
In [380]: M[0,:]
Out[380]: array([0, 1, 2, 3])
In [381]: M[:,0]
Out[381]: array([0, 4, 8])
列表相同:
In [383]: M.tolist()
Out[383]: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
In [384]: M.tolist()[0]
Out[384]: [0, 1, 2, 3]
具有 list/array 或切片的索引确实保留了维度:
In [385]: M[:,[0]]
Out[385]:
array([[0],
[4],
[8]])
因此将 (3,) 分配给 (3,) 插槽就可以了:
In [386]: M[:,0] = [10,20,30]
将 (3,1) 分配给该插槽会产生错误:
In [387]: M[:,0] = [[10],[20],[30]]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
<ipython-input-387-1bbfa6dfa93c> in <module>
----> 1 M[:,0] = [[10],[20],[30]]
ValueError: setting an array element with a sequence.
In [388]: M[:,0] = np.array([[10],[20],[30]]) # or with an array
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-388-6e511ffdc44e> in <module>
----> 1 M[:,0] = np.array([[10],[20],[30]])
ValueError: could not broadcast input array from shape (3,1) into shape (3)
通过广播 (3,) 可以进入 (1,3),但不能 (3,1) 进入 (3,)。一种解决方案是展平 RHS:
In [389]: M[:,0] = np.array([[10],[20],[30]]).ravel()
分配给 (3,1) 插槽也有效:
In [390]: M[:,[0]] = np.array([[10],[20],[30]])
In [391]: M[:,0:1] = np.array([[10],[20],[30]])
我们也可以将 (3,1) 转置为 (1,3)。或者分配给 M[:,0][:,None]
或 M[:,0,None]
(两者都创建一个 (3,1))。