Повторяющийся массив с преобразованием - PullRequest
0 голосов
/ 20 декабря 2018

Как мне повторить следующую последовательность примеров:

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, возможно?

Ответы [ 7 ]

0 голосов
/ 20 декабря 2018

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
0 голосов
/ 27 декабря 2018

Вы можете сделать это на чистом питоне, используя списочные выражения:

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])
0 голосов
/ 20 декабря 2018

Вы можете использовать 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])
0 голосов
/ 20 декабря 2018

Вы можете сделать:

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]
0 голосов
/ 20 декабря 2018

Вот один из способов:

>>> (l * [[1], [2], [4]]).flatten()
array([ 3,  4,  5,  6,  7,  6,  8, 10, 12, 14, 12, 16, 20, 24, 28])

(Работает, только если вы хотите, чтобы кратные входные.)

0 голосов
/ 20 декабря 2018

Вы можете использовать объединение и составить список, используя степени 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])
0 голосов
/ 20 декабря 2018

Вы можете циклически повторять 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...