假设我有一个数组(不一定正方形)
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']
谢谢!
使用np.repeat
:
my_array[:,0].repeat(my_array[:,1].astype(int))
# array(['name_1', 'name_1', 'name_1', 'name_2', 'name_2'], dtype='<U6')
您可以使用列表乘法和qazxswpoi的组合:
sum
我不是一个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
这里的另一种方法,跳绳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
使用列表理解:
def expanded(matrix):
stream = iter(matrix)
for element, count in zip(stream, stream):
for _ in range(count):
yield element
list(expanded(my_array))