i=np.arange(1,4,dtype=np.int)
a=np.arange(9).reshape(3,3)
和
a
>>>array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
a[:,0:1]
>>>array([[0],
[3],
[6]])
a[:,0:2]
>>>array([[0, 1],
[3, 4],
[6, 7]])
a[:,0:3]
>>>array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
现在我想对数组进行矢量化以将它们一起打印出来。我试试
a[:,0:i]
或
a[:,0:i[:,None]]
它给出TypeError:只能将整数标量数组转换为标量索引
答案 0 :(得分:17)
简短回答:
[a[:,:j] for j in i]
您要做的是不是可矢量化的操作。 Wikipedia defines矢量化作为单个数组上的批处理操作,而不是单个标量:
在计算机科学中,数组编程语言(也称为向量或多维语言)概括了对标量的操作,以透明地应用于向量,矩阵和高维数组。
...
...对整个阵列进行操作的操作可称为矢量化操作......
就CPU级别优化而言,definition of vectorization是:
"矢量" (简化)是重写循环的过程,这样它不是处理数组的单个元素N次,而是同时处理(比如说)数组的4个元素N / 4次。
您的案例存在的问题是每个操作的结果都有不同的形状:(3, 1)
,(3, 2)
和(3, 3)
。它们不能形成单个矢量化操作的输出,因为输出必须是一个连续的数组。当然,它可以在其中包含(3, 1)
,(3, 2)
和(3, 3)
数组(作为视图),但这是原始数组a
已经执行的操作。
你真正想要的只是一个计算所有这些的表达式:
[a[:,:j] for j in i]
...但它在性能优化方面没有矢量化。在引擎盖下,它是一个简单的旧for
循环,逐个计算每个项目。
答案 1 :(得分:8)
尝试以下操作将数组更改为1D
a.reshape((1, -1))
答案 2 :(得分:4)
您可以使用numpy.ravel从n维数组返回展平的数组:
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> a.ravel()
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
答案 3 :(得分:3)
这可能与该特定问题无关,但是我遇到了一个类似的问题,在该问题上,我在Python列表上使用了NumPy索引并得到了相同的错误消息:
# incorrect
weights = list(range(1, 129)) + list(range(128, 0, -1))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]
# TypeError: only integer scalar arrays can be converted to a scalar index
事实证明,在应用多维NumPy索引之前,我需要将1D Python列表weights
转换为NumPy数组。下面的代码有效:
# correct
weights = np.array(list(range(1, 129)) + list(range(128, 0, -1)))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]
答案 4 :(得分:2)
我遇到了类似的问题,并使用列表解决了这个问题...不确定这是否有帮助
classes = list(unique_labels(y_true, y_pred))
答案 5 :(得分:0)
当我们使用向量代替标量时会出现此问题 例如,在for循环中,范围应为标量,以防万一您在该位置给出了向量,否则会出错。因此,为避免此问题,请使用您使用过的向量的长度
答案 6 :(得分:0)
在尝试使用numpy.concatenate模拟2D矢量的C ++之类的问题时,我遇到了问题。如果A和B是两个二维numpy.arrays,则numpy.concatenate(A,B)会产生错误。
解决方法是简单地添加缺少括号:numpy.concatenate(( A,B )),因为要串联的数组构成一个单个参数