使用可变列迭代列数

时间:2016-10-05 22:38:07

标签: python numpy for-loop matrix

例如,让我们考虑这个玩具代码

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))

为了获得列向量,但这很昂贵。

所以,问题是:处理这种情况的最佳方法是什么? 这似乎是经常出现的事情,我想知道处理它的最佳策略是什么。

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形状。但请在工具箱中保留两个选项。