最小化 numpy 数组操作的运行时间

minimize runtime for numpy array manipulation

我有一个 np.shape(input)=(a,b) 的二维数组,它看起来像

input=array[array_1[0,0,0,1,0,1,2,0,3,3,2,...,entry_b],...array_a[1,0,0,1,2,2,0,3,1,3,3,...,entry_b]]

现在我想创建一个数组np.shape(output)=(a,b,b),其中输入中具有相同值的每个条目都获得值 1,否则为 0

例如:

input=[[1,0,0,0,1,2]]

output=[array([[1., 0., 0., 0., 1., 0.],
               [0., 1., 1., 1., 0., 0.],
               [0., 1., 1., 1., 0., 0.],
               [0., 1., 1., 1., 0., 0.],
               [1., 0., 0., 0., 1., 0.],
               [0., 0., 0., 0., 0., 1.]])]

到目前为止我的代码看起来像:

def get_matrix(svdata,padding_size):
List=[]
for k in svdata:
    matrix=np.zeros((padding_size,padding_size))
    for l in range(padding_size):
        for m in range(padding_size):
            if k[l]==k[m]:
                matrix[l][m]=1
    List.append(matrix)
return List

但是输入形状为 (2000,256) 的数组需要 2:30 分钟。如何使用内置的 numpy 解决方案提高效率?

res = input[:,:,None]==input[:,None,:]

应该给出布尔 (a,b,b) 数组

res = res.astype(int)

获取0/1数组

您正在尝试创建数组 y,其中 y[i,j,k]1 如果 input[i,j] == input[i, k]。至少那是我认为你正在尝试做的。

所以y = input[:,:,None] == input[:,None,:]会给你一个布尔数组。如果需要,您可以使用 astype(...) 将其转换为 np.dtype('float64')