【发布时间】:2019-01-05 07:40:19
【问题描述】:
我有一个矩阵,其中包含 [0, 5] 之间的数字。矩阵非常稀疏,大部分元素为零。我想分别对每一行应用最小-最大缩放,使所有元素都在 [-1, 1] 之间。但是,我只想考虑非零元素。例如,考虑以下矩阵:
[[0.5 3. 0. 2. 0. ]
[0. 4. 5. 0. 0. ]
[3. 0. 0. 2.5 4. ]]
转换后的样子:(如你所见,0个元素未被触及)
[[-1. 1. 0. 0.2 0. ]
[ 0. -1. 1. 0. 0. ]
[-0.33333333 0. 0. -1. 1. ]]
我可以使用以下代码对普通的 numpy 数组执行此操作:
max_arr = A.max(axis=1)
min_arr = np.where(A == 0, A.max(), A).min(axis=1)
row_idx, col_idx = A.nonzero()
A_scaled = np.zeros_like(A)
for row, col in zip(row_idx, col_idx):
element = A[row, col]
A_scaled[row, col] = 2 * ((element - min_arr[row]) / (max_arr[row] - min_arr[row])) - 1
这里有几个问题。首先,它很慢(可能是因为 for 循环?)。另一件事是我的矩阵是稀疏的,所以我想使用稀疏的csr_matrix 格式。如果矩阵A 是csr_matrix,则此代码不起作用。它在第 2 行给出错误说 ValueError: setting an array element with a sequence.
我怎样才能以一种快速且节省内存的方式实现这一目标?我查看了sklearn.preprocessing.MinMaxScaler,但它不支持通过排除零来进行缩放。
【问题讨论】:
-
@Divakar,是的。抱歉,回复晚了,直到现在我才抽出时间尝试您的代码。它就像一个魅力,它肯定要快得多。谢谢。