Многомерный массив с помощью пользовательского ввода в Python - PullRequest
0 голосов
/ 12 февраля 2019

Я использовал ноутбук Jupyter, я новичок в Python, я пытаюсь получить значение от пользователя в многомерном массиве, как мне это сделать?Я пишу небольшой код, после ввода первого значения получаю ошибку, которую я не понимаю

Ошибка:

Traceback (most recent call last)
   <ipython-input-64-4d8986a5e412> in <module>
          5 for i in range(lengthrow):
          6     for j in range(lengthcol):
    ----> 7         arr[i][j]=int(input("enter value"))
          8 print(arr)

IndexError: индекс 0 выходит за пределы оси 0с размером 0

код:

from numpy import*
arr = array([[],[]])
lengthrow=int(input("enter array row length"))
lengthcol=int(input("enter array col length"))
for i in range(lengthrow):
    for j in range(lengthcol):
        arr[i][j]=int(input("enter value"))
print(arr)

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Я принял @Austin отличный ответ и внес несколько небольших изменений:

import numpy as np

n_rows = int(input("Enter number of rows: "))
n_cols = int(input("Enter number of columns: "))

arr = [[int(input("Enter value for {}. row and {}. column: ".format(r + 1, c + 1))) for c in range(n_cols)] for r in range(n_rows)]

print(np.array(arr))

Вывод:

Enter number of rows: 2
Enter number of columns: 3
Enter value for 1. row and 1. column: 1
Enter value for 1. row and 2. column: 2
Enter value for 1. row and 3. column: 3
Enter value for 2. row and 1. column: 4
Enter value for 2. row and 2. column: 5
Enter value for 2. row and 3. column: 6
[[1 2 3]
 [4 5 6]]

Вы получили исключение, потому что вы инициализировали пустой массив и использовалинедействительные индексы.С помощью этого ответа вы генерируете массив после ввода пользовательских данных.


Вот длинная версия однострочного (arr = [[...), которая дает тот же результат:

outer_arr = []
for r in range(n_rows):
    inner_arr = []
    for c in range(n_cols):
        num = int(input("Enter value for {}. row and {}. column: ".format(r + 1, c + 1)))
        inner_arr.append(num)
    outer_arr.append(inner_arr)

print(np.array(outer_arr))
0 голосов
/ 12 февраля 2019

Проблема заключается в форме исходного массива:

In [1]: arr = np.array([[], []])
In [2]: arr
Out[2]: array([], shape=(2, 0), dtype=float64)
In [3]: arr[0]
Out[3]: array([], dtype=float64)
In [4]: arr[0][0]
... 
IndexError: index 0 is out of bounds for axis 0 with size 0

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

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

In [8]: lengthrow, lengthcol = 2,3    # or user input
In [9]: arr = np.zeros((lengthrow, lengthcol), dtype=int)  # large enough array
In [10]: arr
Out[10]: 
array([[0, 0, 0],
       [0, 0, 0]])
In [11]: for i in range(2):
    ...:     for j in range(3):
    ...:         arr[i,j] = int(input(f'{i},{j}:'))
    ...:         
0,0:0
0,1:1
0,2:2
1,0:3
1,1:4
1,2:5
In [12]: arr
Out[12]: 
array([[0, 1, 2],
       [3, 4, 5]])
0 голосов
/ 12 февраля 2019

Вы можете использовать списки здесь, так как конечный результат - список списков:

lengthrow = int(input("enter array row length: "))
lengthcol = int(input("enter array col length: "))

arr = [[int(input("enter value: ")) for _ in range(lengthcol)] for _ in range(lengthrow)]

print(arr)

Проблема с вашим кодом:

arr = array([[],[]])
print(arr.shape)
# (2, 0)

Это означает, что у вас есть столбец размера 0 в массиве, поэтому, когда вы, например, делаете arr[0][0], он выдает ошибку.

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