2D массивы в Python - PullRequest
23 голосов
/ 13 мая 2009

Какой лучший способ создания 2D-массивов в Python?

То, что я хочу, это хочу, чтобы хранить такие значения:

X , Y , Z

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

Ответы [ 8 ]

22 голосов
/ 13 мая 2009
>>> a = []

>>> for i in xrange(3):
...     a.append([])
...     for j in xrange(3):
...             a[i].append(i+j)
...
>>> a
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>>
10 голосов
/ 13 мая 2009

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

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. Хорошие шансы, что у вас есть нечто более интересное, чем матрица.

9 голосов
/ 13 мая 2009

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

7 голосов
/ 13 мая 2009

Если вы хотите серьезно поработать с массивами, вам следует использовать numpy library . Это позволит вам, например, выполнять сложение векторов и умножение матриц, а для больших массивов это намного быстрее, чем списки 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

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

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

5 голосов
/ 13 мая 2009

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

arr = {}

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

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

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

3 голосов
/ 13 мая 2009

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

0 голосов
/ 05 февраля 2018
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 вы создаете многомерные массивы

0 голосов
/ 12 июня 2015

Пожалуйста, обратите внимание на следующие коды:

from numpy import zeros
scores = zeros((len(chain1),len(chain2)), float)
...