【发布时间】:2019-05-21 05:42:00
【问题描述】:
如何重复以下示例序列:
l = np.array([3,4,5,6,7])
最多n 次,每次重复时值加倍。所以对于n=3:
[3, 4, 5, 6, 7, 6, 8, 10, 12, 14, 12, 16, 20, 24, 28]
有没有一种简单的方法可以避免numpy 的循环?
【问题讨论】:
-
循环是你最好的选择,你不能使用循环有什么原因吗?
如何重复以下示例序列:
l = np.array([3,4,5,6,7])
最多n 次,每次重复时值加倍。所以对于n=3:
[3, 4, 5, 6, 7, 6, 8, 10, 12, 14, 12, 16, 20, 24, 28]
有没有一种简单的方法可以避免numpy 的循环?
【问题讨论】:
numpy.outer + numpy.ndarray.ravel:
>>> a = np.array([3,4,5,6,7])
>>> n = 3
>>> factors = 2**np.arange(n)
>>> np.outer(factors, a).ravel()
array([ 3, 4, 5, 6, 7, 6, 8, 10, 12, 14, 12, 16, 20, 24, 28])
详情:
>>> factors
array([1, 2, 4])
>>> np.outer(factors, a)
array([[ 3, 4, 5, 6, 7], # 1*a
[ 6, 8, 10, 12, 14], # 2*a
[12, 16, 20, 24, 28]]) # 4*a
【讨论】:
您可以使用 2 的幂作为乘法因子来使用连接和列表推导。这里3是你需要的重复次数。
l = np.array([3,4,5,6,7])
final = np.concatenate([l*2**(i) for i in range(3)])
print (final)
array([ 3, 4, 5, 6, 7, 6, 8, 10, 12, 14, 12, 16, 20, 24, 28])
【讨论】:
这是一种方法:
>>> (l * [[1], [2], [4]]).flatten()
array([ 3, 4, 5, 6, 7, 6, 8, 10, 12, 14, 12, 16, 20, 24, 28])
(仅当您想要多个输入时才有效。)
【讨论】:
你可以这样做:
import numpy as np
l = np.array([3, 4, 5, 6, 7])
rows = np.tile(l, 3).reshape(-1, len(l)) * np.power(2, np.arange(3)).reshape(-1, 1)
print(rows.flatten())
输出
[ 3 4 5 6 7 6 8 10 12 14 12 16 20 24 28]
【讨论】:
您可以将np.power 与np.ndarray.ravel 一起使用:
A = np.array([3,4,5,6,7])
res = (A * np.power(2, np.arange(3))[:, None]).ravel()
print(res)
array([ 3, 4, 5, 6, 7, 6, 8, 10, 12, 14, 12, 16, 20, 24, 28])
【讨论】:
您可以循环n,并每次连接一个新列表:
l = [3,4,5,6,7]
n = 3
new_l = []
for i in range(n):
new_l += [j*2**i for j in l]
new_l = np.array(new_l)
输出
array([3, 4, 5, 6, 7, 6, 8, 10, 12, 14, 12, 16, 20, 24, 28])
【讨论】:
您可以在纯 python 中使用列表推导来做到这一点:
l = [3,4,5,6,7]
n = 3
mult = [1 * 2**i for i in range(n)]
final = list([x*m for m in mult for x in l])
【讨论】: