Как создать n массивов с заданными именами? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть какой-то трехмерный массив, и я хочу взять из каждого массива значение в той же позиции, а затем скопировать его в массив с именем позиции.

Например, у меня есть три массива 2x2x2и я хочу взять значение в позиции (1,1,1) каждой из этих матриц и скопировать его в массив с именем 111array. Затем этот массив должен содержать три значения. То же самое должно быть сделано для всех значений и всех позиций в матрице

У меня есть цикл for, который выполняет итерацию по всем значениям в одном массиве. Но я не знаю, как правильно сохранить результат в массиве, чтобы имя массива отображало номер позиции.

Мой первый массив называется b.

for i in range(b.shape[0]):
    for j in range(b.shape[1]):
        for k in range(b.shape[2]):
            print(b[i,j,k])

Ищупомощь!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

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

import numpy as np

b = np.array([0, 1, 2, 3, 4, 5, 6, 7])
b = np.reshape(b, (2, 2, 2))
print(b, type(b))
# [[[0 1],
#   [2 3]],
#  [[4 5],
#   [6 7]]] <class 'numpy.ndarray'>

def myfunc(arr):
    for i in range(b.shape[0]):
        for j in range(b.shape[1]):
            for k in range(b.shape[2]):
                # Create a new array name from string parts.
                name = "arr"+str(i)+str(j)+str(k)
                print(name, b[i, j, k])  
                # Example: 'arr000', 0.
                # Add a new key-value pair to the dictionary.
                mydict.update({name: b[i,j,k]}) 
    return(mydict)

mydict = {}
result = myfunc(b)
print(result)
# {'arr000': 0, 'arr001': 1, 'arr010': 2, 'arr011': 3, 'arr100': 4, 
#  'arr101': 5, 'arr110': 6, 'arr111': 7}

# You would need to unpack the dictionary to use the arrays separately.
# use "mydict.keys()" to get all array names.
# "for key in keys" to loop through all array names. 
# mydict['arr000'] will return the value 0.

Ваш вопрос помечен как "numpy", но не использует его в вашем фрагменте кода. Если вы пытаетесь придерживаться numpy , существует еще один метод, называемый «массив структурированных данных». Это похоже на словарь в том, что «имя» и «значение» могут храниться в виде парных множеств в массиве. Это обеспечивает эффективное управление памятью и быстрые вычисления (оптимизация C). Это важно, если вы работаете с большими наборами данных.

Также при работе с numpy может быть способ использовать значения индекса в именах переменных.

Позже я подумаю над примерами для обоих и по возможности обновлю свой ответ.

0 голосов
/ 30 сентября 2019

Посмотрите, хотите ли вы этого. Это основано на вашем примере.

import numpy as np
from itertools import product


a = np.arange(8).reshape(2,2,2)
b = a + 1
c = a + 2

indices = product(range(2), repeat=3)
all_arrays = []
for i in indices:
    suffix = ''.join(map(str,i))
    array_name = 'array'+suffix

    value = np.array([a[i],b[i],c[i]])
    exec(array_name+'= value')
    exec(f'all_arrays.append({array_name})')

for name in all_arrays:
    print(name)
print('\n')
print(all_arrays)
print('\n')
print(array111)
print('\n')
print(array101)

Вывод:

[0 1 2]
[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]
[5 6 7]
[6 7 8]
[7 8 9]

[array([0, 1, 2]), array([1, 2, 3]), array([2, 3, 4]), array([3, 4, 5]), array([4, 5, 6]), array([5, 6, 7]), array([6, 7, 8]), array([7, 8, 9])]

[7 8 9]

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