最小化 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')
。
我有一个 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')
。