замена значения в списке массивов NumPy - PullRequest
1 голос
/ 12 марта 2019

Мне нужно сгенерировать два списка массивов: каждый список будет содержать 1d-массивы, но длины каждого 1d-массива могут быть разными.Первый список будет содержать некоторые значимые значения.Второй список должен быть точно такой же по форме, но должен содержать только его.

Код для генерации первого массива:

myarray=[]
rowcount=3
elements_per_row=[2,3,5]
for i in range (0,rowcount):
    elements=elements_per_row[i]
    temparray=np.random.randn(elements)
    myarray.append(temparray)

Вывод кода выше будет списком массивов (а именно- 3 массива с 2,3,5 элементами, заполненными случайными числами).

У меня есть два вопроса:

  1. Есть ли более элегантный / векторизованный / вычислительно быстрееспособ создания первого списка (массив массивов будет в порядке)?

  2. Создайте список массивов точно такой же формы, но заполненных ими:

Я понимаю самый простой способ: просто добавьте одинбольше массива в начале, и заполните его np.ones.Подход «грубой силы» будет выглядеть следующим образом:

myarray=[]
arrayofones=[]
rowcount=3
elements_per_row=[2,3,5]
for i in range (0,rowcount):
    elements=elements_per_row[i]

    #generating meaningful values
    temparray=np.random.randn(elements)
    myarray.append(temparray)

    # generating ones
    temparray=np.ones(elements)
    arrayofones.append(temparray)

Но какой подход будет лучше, если в качестве входных данных будет дан myarray, и мне все еще нужно получить список из них?

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Вы можете использовать списки:

ваш код:

import numpy as np

myarray=[]
arrayofones=[]
rowcount=3
elements_per_row=[2,3,5]
for i in range (0,rowcount):
    elements=elements_per_row[i]
    #generating meaningfull values
    temparray=np.random.randn(elements)
    myarray.append(temparray)
    # generating ones
    temparray=np.ones(elements)
    arrayofones.append(temparray)
Execution time: 40 µs ± 2.11 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Список представлений (вы можете указать myarray в качестве входных данных):

elements_per_row=[2,3,5]
myarray = [np.random.randn(elements) for elements in elements_per_row]
arrayofones = [np.ones_like(a) for a in myarray]
Execution time: 29.1 µs ± 492 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
0 голосов
/ 12 марта 2019

Для создания первого массива вы можете упростить код до:

import numpy as np

elements_per_row = [2, 3, 5]
myarray = [np.random.randn(elements) for elements in elements_per_row]

Чтобы создать массивы с одинаковой формой, вы можете просто сделать:

arrayofones = [np.ones_like(array) for array in myarray]

InВ принципе нет более векторизованного способа сделать это, так как массивы NumPy не могут иметь срезы с разными размерами.Возможно, самым близким будет использование маскированного массива :

import numpy as np

np.random.seed(100)
elements_per_row = np.array([2, 3, 5])
max_elements = elements_per_row.max()
data = np.random.randn(len(elements_per_row), max_elements)
mask = np.arange(max_elements) >= elements_per_row[:, np.newaxis]
myarray = np.ma.array(data, mask=mask)
print(myarray)
# [[-1.7497654730546974 0.34268040332750216 -- -- --]
#  [0.5142188413943821 0.22117966922140045 -1.0700433305682933 -- --]
#  [-0.4580269855026243 0.43516348812289213 -0.5835950503226648
#   0.816847071685779 0.672720805709661]]
arrayofones = np.ones_like(myarray)
print(arrayofones)
# [[1.0 1.0 -- -- --]
#  [1.0 1.0 1.0 -- --]
#  [1.0 1.0 1.0 1.0 1.0]]

В зависимости от вашего случая использование маскированного массива может сделать вещи проще или более громоздкими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...