如何在python中使用多个索引同时填充numpy数组
我有一个列表,如下所示,在每个列表中,第一个元素有索引,第二个元素有每个索引的值注意:列表中的每个元素都是一个numpy数组如何在python中使用多个索引同时填充numpy数组,python,numpy,Python,Numpy,我有一个列表,如下所示,在每个列表中,第一个元素有索引,第二个元素有每个索引的值注意:列表中的每个元素都是一个numpy数组 mylist = [[[1 2 4 5], [0.1 0.7 0.7 0.7]], [[0 3], [0.2 0.4]]] 所以我的最终输出应该是这样的数组 [0.2, 0.1, 0.7, 0.4, 0.7, 0.7] 我知道数组的长度。因此,在上面的数组中,长度是6 因此,我定义了一个numpy数组,如下所示 import numpy as np np.empty(
mylist = [[[1 2 4 5], [0.1 0.7 0.7 0.7]], [[0 3], [0.2 0.4]]]
所以我的最终输出应该是这样的数组
[0.2, 0.1, 0.7, 0.4, 0.7, 0.7]
我知道数组的长度。因此,在上面的数组中,长度是6
因此,我定义了一个numpy数组,如下所示
import numpy as np
np.empty(6, dtype=object)
我想知道是否有可能在每次迭代中同时填充numpy数组而不逐个填充每个索引
如果需要,我很乐意提供更多详细信息。您可以使用阵列的长度作为提取正确索引的指南:
new_list = []
for i in range(6):
for x in mylist:
if i in x[0]:
new_list.append(x[1][i])
new_array = np.asaray(new_list)
您可以使用数组的长度作为导出正确索引的指南:
new_list = []
for i in range(6):
for x in mylist:
if i in x[0]:
new_list.append(x[1][i])
new_array = np.asaray(new_list)
如果我正确理解mylist的结构,这应该是可行的: >>>idcs,VAL=np.hstackmylist >>>VAL[idcs.argsort] 数组[0.2,0.1,0.7,0.4,0.7,0.7] 编辑:正如Paul Panzer在评论中指出的,排序操作是不必要的。如果你不使用大数据集,我怀疑你会看到不同,但这里有另一种方法,应该是线性时间: >>>idcs,VAL=np.hstackmylist >>>out=np.zeroslenidcs >>>out[idcs.astypeint]=VAL >>>出去 数组[0.2,0.1,0.7,0.4,0.7,0.7] 虽然我不太喜欢它,因为类型转换 编辑:另一个,不进行类型转换: >>>idcs,vals=mapnp.hstack,zip*mylist >>>out=np.zeroslenidcs >>>out[idcs]=VAL >>>出去 数组[0.2,0.1,0.7,0.4,0.7,0.7]
如果我正确理解mylist的结构,这应该是可行的: >>>idcs,VAL=np.hstackmylist >>>VAL[idcs.argsort] 数组[0.2,0.1,0.7,0.4,0.7,0.7] 编辑:正如Paul Panzer在评论中指出的,排序操作是不必要的。如果你不使用大数据集,我怀疑你会看到不同,但这里有另一种方法,应该是线性时间: >>>idcs,VAL=np.hstackmylist >>>out=np.zeroslenidcs >>>out[idcs.astypeint]=VAL >>>出去 数组[0.2,0.1,0.7,0.4,0.7,0.7] 虽然我不太喜欢它,因为类型转换 编辑:另一个,不进行类型转换: >>>idcs,vals=mapnp.hstack,zip*mylist >>>out=np.zeroslenidcs >>>out[idcs]=VAL >>>出去 数组[0.2,0.1,0.7,0.4,0.7,0.7]
下面是三种解决方案的一些时间安排@Seb的hstack,一个基于串联的解决方案和一个简单的循环: 生成图形的代码:
from simple_benchmark import BenchmarkBuilder, MultiArgument
import numpy as np
B = BenchmarkBuilder()
@B.add_function()
def loop(L,n):
out = np.empty(n)
for idx,data in L:
out[idx] = data
return out
@B.add_function()
def concat(L,n):
idx,data = map(np.concatenate,zip(*L))
out = np.empty_like(data)
out[idx] = data
return out
@B.add_function()
def hstack2(L,n):
idx,data = map(np.hstack,zip(*L))
out = np.empty_like(data)
out[idx] = data
return out
@B.add_function()
def hstack(L,n):
idx,data = np.hstack(L)
out = np.empty_like(data)
out[idx.astype(int)] = data
return out
@B.add_arguments('total size')
def argument_provider():
for exp in range(2,20):
sz = int(2**exp)
szs = np.random.randint(1,10,sz)
SZS = szs.cumsum()
idx = np.split(np.random.permutation(SZS[-1]),SZS[:-1])
data = np.arange(1,SZS[-1]+1)*0.1
yield SZS[-1], MultiArgument([[[i,data[i]] for i in idx],SZS[-1]])
r = B.run()
r.plot()
import pylab
pylab.savefig('unchop.png')
下面是三种解决方案的一些时间安排@Seb的hstack,一个基于串联的解决方案和一个简单的循环: 生成图形的代码:
from simple_benchmark import BenchmarkBuilder, MultiArgument
import numpy as np
B = BenchmarkBuilder()
@B.add_function()
def loop(L,n):
out = np.empty(n)
for idx,data in L:
out[idx] = data
return out
@B.add_function()
def concat(L,n):
idx,data = map(np.concatenate,zip(*L))
out = np.empty_like(data)
out[idx] = data
return out
@B.add_function()
def hstack2(L,n):
idx,data = map(np.hstack,zip(*L))
out = np.empty_like(data)
out[idx] = data
return out
@B.add_function()
def hstack(L,n):
idx,data = np.hstack(L)
out = np.empty_like(data)
out[idx.astype(int)] = data
return out
@B.add_arguments('total size')
def argument_provider():
for exp in range(2,20):
sz = int(2**exp)
szs = np.random.randint(1,10,sz)
SZS = szs.cumsum()
idx = np.split(np.random.permutation(SZS[-1]),SZS[:-1])
data = np.arange(1,SZS[-1]+1)*0.1
yield SZS[-1], MultiArgument([[[i,data[i]] for i in idx],SZS[-1]])
r = B.run()
r.plot()
import pylab
pylab.savefig('unchop.png')
非常感谢。我在找这样的东西这是一个非常聪明的答案,也是np.hstack+的一个很好的例子argsort@PeptideWitch这也是一个On问题的On log n解决方案。@PaulPanzer很公平-我添加了另一个应该是On@Seb首先不使用hstack可以避免您不喜欢的背面类型转换。谢谢。我在找这样的东西这是一个非常聪明的答案,也是np.hstack+的一个很好的例子argsort@PeptideWitch这也是一个On问题的On log n解决方案。@PaulPanzer很公平-我添加了另一个应该是On@Seb首先不使用hstack可以避免不喜欢的back-type转换。我必须承认,我觉得有点傻,因为这个简单的循环甚至没有出现me@Seb别为这事自责。我们一直被告知不要在numpy做循环。我必须承认,我觉得有点傻,因为这个简单的循环根本就没有出现过me@Seb别为这事自责。我们一直被告知不要在numpy做循环。需要一些经验才能了解例外情况可能存在的地方。