如何在python中使用多个索引同时填充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(

我有一个列表,如下所示,在每个列表中,第一个元素有索引,第二个元素有每个索引的值注意:列表中的每个元素都是一个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(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做循环。需要一些经验才能了解例外情况可能存在的地方。