2016-04-11 15 views
1

Я читал о том, как важно распределить массив numpy. В моем случае я, однако, не знаю, как это сделать. Я хочу предварительно выделить матрицу nxm. Это звучит достаточно простоpreallocation массив numpy массивов numpy

M = np.zeros((n,m)) 

Однако, что, если моя матрица является матрицей матриц? Так что, если каждый из этих элементов NXM фактически формы

np.array([[t], [x0,x1,x2], [y0,y1,y2]]) 

Я знаю, что в этом случае М будет иметь вид (п, т, 3). В качестве примера, позже я хочу иметь что-то вроде этого

[[[[0], [0,1,2], [3,4,5]], 
    [[1], [10,11,12], [13,14,15]]], 
[[[0], [100,101,102], [103,104,105]], 
    [[1], [110,111,112], [113,114,115]]]] 

Я пытался просто делать

M = np.zeros((2,2,3)) 

, но затем

M[0,0,:] = np.array([[0], [0,1,2], [3,4,5]]) 

даст мне ошибку

ValueError: setting an array element with a sequence.

Ca n Я не предопределяю этого монстра? Или я должен подойти к этому совершенно по-другому?

Спасибо за вашу помощь

+0

Ваши примеры не будут работать, потому что вы забыли включить '[]' в вызовы 'np.array'. Также, пожалуйста, используйте реальные числа вместо неопределенных переменных, чтобы было легче видеть, что вы хотите. В настоящее время каждый из 't',' x000' может быть числом или numpy-массивом или что-то еще. См. Также: [mcve] – MSeifert

+0

Спасибо, '[]', к сожалению, не то, что отсутствует. Я отредактировал этот пример, и я также обнаружил, что мне нужно 'M.shape = (m, n, 3)'. Но это все равно не сработает. – grinsbaeckchen

+0

Почему бы просто не собрать список на массивах? – hpaulj

ответ

0

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

Например, вы хотите сохранить 3 2x3 матрицы:

number_of_matrices = 3 
matrix_dim_1 = 2 
matrix_dim_2 = 3 

M = np.empty((number_of_matrices, matrix_dim_1, matrix_dim_2)) 
M[0] = np.array([[ 0, 1, 2], [ 3, 4, 5]]) 
M[1] = np.array([[100, 101, 102], [103, 104, 105]]) 
M[2] = np.array([[ 10, 11, 12], [ 13, 14, 15]]) 

M 
#array([[[ 0., 1., 2.],   # matrix 1 
#  [ 3., 4., 5.]], 
# 
#  [[ 100., 101., 102.],   # matrix 2 
#  [ 103., 104., 105.]], 
# 
#  [[ 10., 11., 12.],   # matrix 3 
#  [ 13., 14., 15.]]]) 

Вы подход содержит некоторые проблемы. Массив вы хотите сохранить не является допустимым ndimensional NumPy массива:

np.array([[0], [0,1,2], [3,4,5]]) 
# array([[0], [0, 1, 2], [3, 4, 5]], dtype=object) 
#         |----!!----| 
#   ^-------^----------^  3 items in first dimension 
#  ^      1 item in first item of 2nd dim 
#    ^--^--^    3 items in second item of 2nd dim 
#       ^--^--^ 3 items in third item of 2nd dim  

Он создает массив в 3 пункт, содержащий Python list объектов. Вероятно, вы хотите иметь массив, содержащий числа, поэтому вам нужно заботиться о размерах. Ваш np.array([[0], [0,1,2], [3,4,5]]) может быть массивом 3x1 или массивом 3x3, numpy не знает, что делать в этом случае и сохраняет его как объекты (массив теперь имеет только 1 размер!).


Другая проблема заключается в том, что вы хотите установить один элемент массива предопределенного с другим массивом, который содержит более одного элемент. Это невозможно (за исключением того, что у вас уже есть object -array). У вас есть два варианта здесь:

  1. Fill как многие элементы в предопределенные массиве, которые требуются в массиве:

    M[0, :, :] = np.array([[0,1,2], [3,4,5]]) 
    # ^--------------------^--------^  First dimension has 2 items 
    #  ^---------------^-^-^   Second dimension has 3 items 
    #  ^------------------------^-^-^ dito 
    # if it's the first dimension you could also use M[0] 
    
  2. Создайте object массив и установить элемент (не рекомендуется, рыхлое большинство преимуществ Numpy массивов):

    M = np.empty((3), dtype='object') 
    M[0] = np.array([[0,1,2], [3,4,5]]) 
    M[1] = np.array([[0,1,2], [3,4,5]]) 
    M[2] = np.array([[0,1,2], [3,4,5]]) 
    M 
    #array([array([[0, 1, 2], 
    #    [3, 4, 5]]), 
    #  array([[0, 1, 2], 
    #    [3, 4, 5]]), 
    #  array([[0, 1, 2], 
    #    [3, 4, 5]])], dtype=object) 
    
+0

ok, я думаю, мне придется переосмыслить всю мою проблему, чтобы избежать вышеуказанного. Возможно, я просто сохраню t, x's, y в одном массиве, а не массиве массивов, и снова разделите его на более позднем этапе, где они мне понадобятся отдельно. – grinsbaeckchen

+0

@grinsbaeckchen - Есть ли причина иметь 't' как часть массива? Похоже, что это всего лишь метаданные для массива. – MSeifert

+0

Да, мне нужно «на более поздней стадии» вместе с соответствующими «х» и «я». И они мне нужны вместе, а не в отдельном массиве. Однако я понял, что в конце концов мне не нужна матрица, для моих нужд достаточно массива/списка. Это делает вещи немного легче. Теперь я просто использовал список вместо np.array. Это может быть медленнее, но сейчас это работает. – grinsbaeckchen

0

Если вы знаете, что только значение магазина t, y, x для каждой точки в n,m, то это может быть проще и быстрее вычислениями, чтобы иметь три Numpy массивы.

Итак:

M_T = np.zeros((n,m)) 
M_Y = np.zeros((n,m)) 
M_X = np.zeros((n,m)) 

Я считаю, что теперь вы можете ввести «нормальные» операторы питона сделать логический массив, такие как:

MX = np.ones((n,m)) 
MY = np.ones((n,m)) 
MT = MX + MY 
MT ** MT 
_ * 7.5 

Определяя массив дружественных функций (аналогично MATLAB) вы получите большой прирост скорости для расчетов.

Конечно, если вам нужно больше переменных в каждой точке, это может стать громоздким.

+0

Упс, я понял, что на самом деле я не ответил на ваш вопрос. Doh – dodell

Смежные вопросы