我有以下 numpy 数组:
from sklearn.decomposition import PCA
from sklearn.preprocessing import normalize
import numpy as np
# NumPy array comprising associate metrics
# i.e. Open TA's, Open SR's, Open SE's
associateMetrics = np.array([[11, 28, 21],
[27, 17, 20],
[19, 31, 3],
[17, 24, 17]]).astype(np.float64)
print("raw metrics=", associateMetrics)
现在,我想为上面数组中的每一列分配不同的权重,然后对其进行标准化。例如。假设我想通过乘以 5、将第 2 列乘以 3、将最后一列乘以 2 来为第一列分配更高的权重。
如何在 python 中执行此操作?抱歉,对 python 和 numpy 有点陌生。
我只尝试了 1 列,但它不起作用:
# Assign weights to metrics
weightedMetrics = associateMetrics
np.multiply(2, weightedMetrics[:,0])
print("weighted metrics=", weightedMetrics)
最佳答案
你应该使用 numpy 的 array broadcasting 。这意味着较低维度的数组可以自动扩展,以使用较高维度(但兼容)的数组执行向量化操作。在您的具体情况下,您可以将 (4,3)
形状的数组与形状 (3,)
的一维权重数组相乘,并获得您想要的结果:
weightedMetrics = associateMetrics * np.array([5,3,2])
诀窍在于,您可以想象 numpy ndarray
具有领先的单例维度,沿着该维度广播是自动的。我的意思是,形状 (3,)
的 1d numpy 权重数组可以被认为具有领先的单例维度(但仅从广播的角度来看!)。很容易看出形状 (4,3)
和 (1,3)
的数组应该如何相乘:后者的每个元素都必须用于完整的前者的列。
在非常一般的情况下,您甚至可以对形状为 (3,1,3,1,4)
的数组和形状为 (2 ,3,4,4)
。重要的是,满足的维度应该一致,或者其中一个数组应该在该位置具有单一维度,并且允许其中一个数组更长(在前面)。
关于python - 为每个 numpy 列分配不同的权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35248159/