我有一个3465 x 50157 NumPy矩阵,我正在尝试使用矩阵的选定列中的每个唯一值作为阈值来测试某个计算。请考虑以下示例:
feat_num = 4
thresholds = np.unique(X[:, feat_num])
for thresh in thresholds:
y_left = np.array([
y[i] for i in range(X.shape[0]) if X[i, feat_num] < thresh
])
运行时,numpy会给我以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().
我已经确认X[i, feat_num]
是一个标量,所以那里没有问题。但是,出于某种原因,thresh
正在评估某种数组。鉴于X
只是一个庞大的整数矩阵,我不知道这是怎么回事。
有人看到发生了什么事吗?
答案 0 :(得分:0)
问题可能是你使用了numpy matrix
而不是numpy ndarray
。后者是更普遍的野兽,我建议你使用它们。 matrix
类型的一个优点是代数运算可以像您从矩阵中预期的那样工作,但这很少是人们所需要的,即使在这些情况下numpy.dot
也可以用来使其适用于ndarray
个对象。
因此,问题是matrix
的列切片是列向量,即形状matrix
的{{1}}(相当于列表列表)。如果您的原始数组是(N,1)
,那么列切片的形状为ndarray
,即它将是1d (N,)
(与平面列表兼容),而不是实际的列向量:< / p>
ndarray
循环使用列向量会给你列表而不是标量,这与你的期望相反。
如果你不在任何地方使用矩阵运算,那么我强烈建议切换到>>> import numpy as np
>>> X = np.random.rand(3,3)
>>> Xmat = np.asmatrix(X)
>>>
>>> print(X[:,1])
[ 0.28797057 0.56186287 0.58674852]
>>> print(Xmat[:,1])
[[ 0.28797057]
[ 0.56186287]
[ 0.58674852]]
个对象,这也应解决你当前的问题。