一列中重复的值基于另一个

问题描述 投票:4回答:5

假设我有一个数组(不一定正方形)

my_array = ['name_1', 3
            'name_2', 2]

我想与其中前三个位置被分配给length 3+2=5和未来2至'name_1' 'name_2'的列表(或numpy的阵列等)来结束。因此,输出将是

['name_1', 'name_1', 'name_1', 'name_2', 'name_2']

这是我迄今所做的;有没有更好的办法做到这一点吗?

import numpy as np

my_array = np.array([['name_1', 3], ['name_2', 2]])
l = []
for i in range(my_array.shape[0]):
    x = [my_array[i, 0].tolist()] * np.int(my_array[i, 1])
    l.append(x)

flat_list = [item for sublist in l for item in sublist]
print(flat_list)

其打印:

['name_1', 'name_1', 'name_1', 'name_2', 'name_2']

谢谢!

python arrays python-3.x numpy
5个回答
3
投票

使用np.repeat

my_array[:,0].repeat(my_array[:,1].astype(int))
# array(['name_1', 'name_1', 'name_1', 'name_2', 'name_2'], dtype='<U6')

2
投票

您可以使用列表乘法和qa​​zxswpoi的组合:

sum

2
投票

我不是一个numpy的专家,“更好”的方式是主观的。下面是使用sum(([my_array[i]] * my_array[i+1] for i in range(0, len(my_array), 2)), []) 一种方式

itertools

下面是它是如何工作的崩溃。

from itertools import chain, repeat chain.from_iterable(repeat(elem, count) for elem, count in zip(my_array[::2], my_array[1::2])) 返回一个切片时每隔一个元件,由于第一和和第二参数被留空,它开始于0,然后进到结束。因此,这将是所有的第一列,这是你的输入元素。你的计数是其他列,所以我们可以用my_array[::2]得到计数。这些片都不错,因为他们不创建数组的新副本,即跳过所有其他元素,并在一些补偿开始只是“意见”。

现在,我们要列举那些对。使用my_array[1::2]是方便了点。它消耗在并行迭代器/发电机/序列并给出了一个单独的每个元素的结合。因此,当我们在zip通过对结构,我们绑定每个元素zip(),每个计数elem

count结构使我们能够提供每对参数的变换。这里我们使用for in建立每个元素的虚拟重复。再一个很好的事情,是我们实际上并没有创造新的阵列。所述repeat发生器将只产生输入元件N次。

最后,我们想办法给字符串的所有这种重复的元素融入其中扁平枚举。这就是repeat进来。它消耗iterables的迭代,展开各一组。像其他件,链将产生一个新的发电机,而不是一个新的列表,所以我们再次对记忆保存。如果你确实需要一个清单,你可以给它在年底chain.from_iterable()。或者只是让输入到list()结构。

这里是所有这一切爆发与释意变量个人操作:

for in

1
投票

这里的另一种方法,跳绳elements = my_array[::2] counts = my_array[1::2] bypairs = zip(elements, counts) repeated = (repeat(elem, count) for elem, count in bypairs) flattened = chain.from_iterable(repeated) list(flattened) ,有利于发电机:

itertools

1
投票

使用列表理解:

def expanded(matrix):
    stream = iter(matrix)
    for element, count in zip(stream, stream):
        for _ in range(count):
            yield element

list(expanded(my_array))
© www.soinside.com 2019 - 2024. All rights reserved.