NUMPY: как заполнить двумерный массив вложенными циклами for - PullRequest
0 голосов
/ 20 января 2020

Итак, я хочу знать, как заполнить массив 2d Numpy, используя вложенные циклы for. Вот фрагмент моего кода ниже:

import numpy as np

y=np.ones(6000).reshape(100,60)
x=1e-5*np.ones(6000).reshape(100,60)
L=60
r=3.9
eps=0.2

def logistic(n,i):
    y[n,i]=r*x[n,i]*(1-x[n,i])
    return y[n,i]

for n in range(99):
    for i in range(L):
         x[n+1,i] = (1-eps)*logistic(n,i)
         print(x)

Этот код генерирует вывод, но я не уверен, должен ли это вывод, который я должен получить. Вот снимок вывода здесь: enter image description here

Я ищу что-то, что генерирует вывод, имеющий следующий алгоритм:

  1. В x[n+1,i] массив для n=1 (т. е. 1-й строки) заполните все элементы столбца массива x (1-eps)*logistic(r,x), используя i=1,2,3...60 в al oop.

  2. Затем, снова для n=2, заполните все элементы столбца массива x с помощью (1-eps)*logistic(r,x), используя i=1,2,3...60 в al oop.

  3. Делайте это до n=99, и выведите окончательный массив.

Будет очень полезно, если вы найдете способ сделать это. После генерации выходных данных я также хочу построить 2d-массив, который в основном является способом создания решетки связанных карт.

1 Ответ

0 голосов
/ 21 января 2020

numpy, похоже, не включает в себя метод построения массива путем кумулятивного применения функции к начальному значению. Вы можете достичь этого с помощью pandas.Series.expanding или pandas.Series.ewm.

Не вдаваясь в pandas, вы можете вместо этого построить столбец как стандартный список и затем умножьте его на 2d массив:

x = 1e-5
column = [x]
for _ in range(99):
    x = (1 - eps) * r * x * (1-x)
    column.append(x)
result = np.array([column] * 60).transpose()

Аналогично вы можете создать функцию генератора и создать массив столбцов, используя fromiter:

def cumulator(start, function, length):
    x = start
    yield x
    for _ in range(length-1):
        x = function(x)
        yield x

column = np.fromiter(cumulator(1e-5, lambda x: (1-eps) * r * x * (1-x), 100), 
                 dtype=float)
result = np.array([column] * 60).transpose()

Или вы можете построить одну строку в время и vstack (вертикально сложить) их:

row = np.full(60, 1e-5)
result = row
for _ in range(99):
    row = (1 - eps) * r * row * (1 - row)
    result = np.vstack((result, row))
...