【问题标题】:minimize runtime for numpy array manipulation最小化 numpy 数组操作的运行时间
【发布时间】:2020-12-01 02:08:41
【问题描述】:

我有一个带有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 解决方案提高效率?

【问题讨论】:

    标签: python arrays numpy data-science


    【解决方案1】:
    res = input[:,:,None]==input[:,None,:]
    

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

    res = res.astype(int)
    

    得到一个 0/​​1 数组

    【讨论】:

    • 这似乎不适用于我的情况。我抬头一看,我输入的形状是 (2000,256,1) 这可能是问题吗?其中 a=2000 和 b=256
    • 是的,我的回答是基于最初声称它是 (a,b) 形状的。使用None,2 个形状变成 (a,b,1) 和 (a,1,b),它们一起广播到 (a,b,b)。那么你想对尾随大小一做些什么呢?您可以将其保留在一个中,并在另一个中交换轴。
    • 嘿,我使用 np.squeeze() 来消除不需要的尺寸,现在它可以正常工作了。感谢您的帮助!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多