以不同的方式二值化 python 中的稀疏矩阵
binarize a sparse matrix in python in a different way
假设我有一个像这样的矩阵:
4 0 3 5
0 2 6 0
7 0 1 0
我希望它二值化为:
0 0 0 0
0 1 0 0
0 0 1 0
即设置阈值等于2,任何大于阈值的元素设置为0,任何小于或等于阈值的元素(0除外)设置为1。
我们可以在 python 的 csr_matrix 或任何其他稀疏矩阵上执行此操作吗?
我知道 scikit-learn 提供 Binarizer 将低于或等于阈值的值替换为 0,高于阈值的值替换为 1。
可能有非常有效的方法可以做到这一点,但可以使用如下简单的 function
和 list
操作来实现
def binarized(matrix, threshold):
for row in matrix:
for each in range(len(matrix)+1):
if row[each] > threshold:
row[each] = 0
elif row[each] != 0:
row[each] = 1
return matrix
matrix = [[4, 0, 3, 5],
[0, 2, 6, 0],
[7, 0, 1, 0]]
print binarized(matrix, 2)
产量 :
[[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]
import numpy as np
x = np.array([[4, 0, 3, 5],
[0, 2, 6, 0],
[7, 0, 1, 0]])
threshold = 2
x[x<=0]=threshold+1
x[x<=threshold]=1
x[x>threshold]=0
print x
输出:
[[0 0 0 0]
[0 1 0 0]
[0 0 1 0]]
在处理稀疏矩阵时,s
,避免包含零的不等式,因为稀疏矩阵(如果您使用得当)应该有很多零并形成一个包含所有位置的数组为零将是巨大的。因此,例如避免使用 s <= 2
。改用 select 远离零的不等式。
import numpy as np
from scipy import sparse
s = sparse.csr_matrix(np.array([[4, 0, 3, 5],
[0, 2, 6, 0],
[7, 0, 1, 0]]))
print(s)
# <3x4 sparse matrix of type '<type 'numpy.int64'>'
# with 7 stored elements in Compressed Sparse Row format>
s[s > 2] = 0
s[s != 0] = 1
print(s.todense())
产量
matrix([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]])
您可以为此使用 numpy.where
:
>>> import numpy as np
>>> import scipy.sparse
>>> mat = scipy.sparse.csr_matrix(np.array([[4, 0, 3, 5],
[0, 2, 6, 0],
[7, 0, 1, 0]])).todense()
>>> np.where(np.logical_and(mat <= 2, mat !=0), 1, 0)
matrix([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]])
假设我有一个像这样的矩阵:
4 0 3 5
0 2 6 0
7 0 1 0
我希望它二值化为:
0 0 0 0
0 1 0 0
0 0 1 0
即设置阈值等于2,任何大于阈值的元素设置为0,任何小于或等于阈值的元素(0除外)设置为1。
我们可以在 python 的 csr_matrix 或任何其他稀疏矩阵上执行此操作吗?
我知道 scikit-learn 提供 Binarizer 将低于或等于阈值的值替换为 0,高于阈值的值替换为 1。
可能有非常有效的方法可以做到这一点,但可以使用如下简单的 function
和 list
操作来实现
def binarized(matrix, threshold):
for row in matrix:
for each in range(len(matrix)+1):
if row[each] > threshold:
row[each] = 0
elif row[each] != 0:
row[each] = 1
return matrix
matrix = [[4, 0, 3, 5],
[0, 2, 6, 0],
[7, 0, 1, 0]]
print binarized(matrix, 2)
产量 :
[[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]
import numpy as np
x = np.array([[4, 0, 3, 5],
[0, 2, 6, 0],
[7, 0, 1, 0]])
threshold = 2
x[x<=0]=threshold+1
x[x<=threshold]=1
x[x>threshold]=0
print x
输出:
[[0 0 0 0]
[0 1 0 0]
[0 0 1 0]]
在处理稀疏矩阵时,s
,避免包含零的不等式,因为稀疏矩阵(如果您使用得当)应该有很多零并形成一个包含所有位置的数组为零将是巨大的。因此,例如避免使用 s <= 2
。改用 select 远离零的不等式。
import numpy as np
from scipy import sparse
s = sparse.csr_matrix(np.array([[4, 0, 3, 5],
[0, 2, 6, 0],
[7, 0, 1, 0]]))
print(s)
# <3x4 sparse matrix of type '<type 'numpy.int64'>'
# with 7 stored elements in Compressed Sparse Row format>
s[s > 2] = 0
s[s != 0] = 1
print(s.todense())
产量
matrix([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]])
您可以为此使用 numpy.where
:
>>> import numpy as np
>>> import scipy.sparse
>>> mat = scipy.sparse.csr_matrix(np.array([[4, 0, 3, 5],
[0, 2, 6, 0],
[7, 0, 1, 0]])).todense()
>>> np.where(np.logical_and(mat <= 2, mat !=0), 1, 0)
matrix([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]])