2D-массивы в Python

Как лучше всего создавать 2D-массивы в Python?

Я хочу хранить такие значения:

X , Y , Z

так что я получаю доступ к таким данным, как X[2],Y[2],Z[2] или X[n],Y[n],Z[n], где n - переменная. Вначале я не знал, насколько большим будет n, поэтому я хотел бы добавить значения в конце.


person Community    schedule 13.05.2009    source источник


Ответы (8)


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

В 80% случаев у вас есть простой список «строковых объектов», которые могут быть правильными последовательностями.

myArray = [ ('pi',3.14159,'r',2), ('e',2.71828,'theta',.5) ]

myArray[0][1] == 3.14159
myArray[1][1] == 2.71828

Чаще всего это экземпляры класса, словаря, набора или чего-то более интересного, чего у вас не было в ваших предыдущих языках.

myArray = [ {'pi':3.1415925,'r':2}, {'e':2.71828,'theta':.5} ]

В 20% случаев у вас есть словарь с парным вводом

myArray = { (2009,'aug'):(some,tuple,of,values), (2009,'sep'):(some,other,tuple) }

В редких случаях вам действительно понадобится матрица.

У вас очень большое количество классов коллекций в Python. Велика вероятность, что у вас есть что-то более интересное, чем матрица.

person S.Lott    schedule 13.05.2009

В Python для этой цели обычно используются списки. Списки могут быть вложены произвольно, что позволяет создавать 2D-массив. Не все подсписки должны быть одинакового размера, так что это решит вашу другую проблему. Взгляните на примеры, на которые я ссылался.

person Stephan202    schedule 13.05.2009

Если вы хотите серьезно поработать с массивами, вам следует использовать библиотеку numpy. Это позволит вам, например, выполнять сложение векторов и умножение матриц, а для больших массивов это намного быстрее, чем списки Python.

Однако numpy требует, чтобы размер был предопределен. Конечно, вы также можете хранить несколько массивов в списке, например:

import numpy as np
vec_list = [np.zeros((3,)) for _ in range(10)]
vec_list.append(np.array([1,2,3]))
vec_sum = vec_list[0] + vec_list[1]  # possible because we use numpy
print vec_list[10][2]  # prints 3

Но поскольку ваши массивы numpy довольно малы, я предполагаю, что есть некоторые накладные расходы по сравнению с использованием кортежа. Все зависит от ваших приоритетов.

См. Также этот другой вопрос, который очень похож (за исключением переменного размера).

person nikow    schedule 13.05.2009
comment
Я задумался, говоря об этом, и да, это полезное дополнение. Разве это не тот случай, когда numpy требует массивов фиксированной длины? - person Stephan202; 13.05.2009
comment
Правда, спасибо, я изменил ответ, чтобы прояснить этот вопрос. - person nikow; 13.05.2009

Я бы посоветовал вам использовать такой словарь:

arr = {}

arr[1] = (1, 2, 4)
arr[18] = (3, 4, 5)

print(arr[1])
>>> (1, 2, 4)

Если вы не уверены, что запись определена в словаре, вам понадобится механизм проверки при вызове "arr [x]", например попробуй кроме.

person Roee Adler    schedule 13.05.2009
comment
Если вам нужен многомерный «массив», вы можете использовать кортежи в качестве ключей в словарях, например: arr [(1, 20)] = 12 - person Rory; 17.05.2009

Если вас беспокоит объем памяти, стандартная библиотека Python содержит модуль массива; эти массивы содержат элементы одного типа.

person Eric O Lebigot    schedule 13.05.2009

Обратите внимание на следующие коды:

from numpy import zeros
scores = zeros((len(chain1),len(chain2)), float)
person C-Zeous    schedule 12.06.2015
comment
Добро пожаловать в Stack Overflow! Дополнительное объяснение улучшит ваш ответ. - person ryanyuyu; 12.06.2015

x=list()
def enter(n):
    y=list()
    for i in  range(0,n):
        y.append(int(input("Enter ")))
    return y
for i in range(0,2):
    x.insert(i,enter(2))
print (x)

здесь я сделал функцию для создания одномерного массива и вставил в другой массив как член массива. несколько 1-мерных массивов внутри массива, поскольку значения n и i меняются, u создают многомерные массивы

person Shah_jahan    schedule 05.02.2018

person    schedule
comment
Я бы написал это функционально - гораздо более кратко: a = [[i + j for j in range(3)] for i in range(3)] - person Dario; 13.05.2009