例如,让我们考虑这个玩具代码
import numpy as np
import numpy.random as rnd
a = rnd.randint(0,10,(10,10))
k = (1,2)
b = a[:,k]
for col in np.arange(np.size(b,1)):
b[:,col] = b[:,col]+col*100
当k
的大小大于1时,此代码将起作用。但是,当大小等于1时,从a
提取的子矩阵将转换为行向量,并应用for
循环中的函数抛出错误。
当然,我可以通过检查b
的维度和重塑:
if np.dim(b) == 1:
b = np.reshape(b, (np.size(b), 1))
为了获得列向量,但这很昂贵。
所以,问题是:处理这种情况的最佳方法是什么? 这似乎是经常出现的事情,我想知道处理它的最佳策略是什么。
答案 0 :(得分:0)
如果使用列表或元组进行索引,则会保留2d形状:
In [638]: a=np.random.randint(0,10,(10,10))
In [639]: a[:,(1,2)].shape
Out[639]: (10, 2)
In [640]: a[:,(1,)].shape
Out[640]: (10, 1)
我认为b
迭代可以简化为:
a[:,k] += np.arange(len(k))*100
这种计算也会更容易,k
始终是列表或元组,而不是标量(标量没有len
)。
np.column_stack
确保其输入为2d(如果没有则扩展到最后):
if arr.ndim < 2:
arr = array(arr, copy=False, subok=True, ndmin=2).T
np.atleast_2d
elif len(ary.shape) == 1:
result = ary[newaxis,:]
当然在这种情况下可以改为
if b.ndim==1:
b = b[:,None]
任何方式,我认为最好确保k
是一个元组而不是之后调整b
形状。但请在工具箱中保留两个选项。