我试图用numpy
制作一个矩阵,然后打印它(之所以这样做,是因为以后我想用更多的矩阵进行数学运算),我得到的错误是:
"IndexError: arrays used as indices must be of integer (or boolean) type".
我尝试在for循环中使用np.zeros
数组,但是没有用(出现类似错误)。
注意::我尝试使用np.matrix
函数(将np.zeros
数组分配给列和行,但是它也没有用,然后我尝试了变体(np.ndarray
就是您可以看到的注释))。
代码:
import numpy
def matrixes():
col= int(input("Enter the number of columns\n"))
row= int(input("Enter the number of rows\n"))
print(col,row)
nCol=numpy.zeros(col)
nRow=numpy.zeros(row)
list_col=[nCol]
list_Row=[nRow]
print(nCol, nRow)
#nArray=numpy.ndarray(nCol,nRow).reshape(2,2)
for i in list_col:
for j in list_Row:
print("Enter value ",nCol,nRow)
a=int(input())
nCol[i]=a
nRow[j]=a
print("The matrix is: ",nCol, nRow)
#def __init__():
a = int(input("Enter an option\n"
"1. Matrixes\n"))
if a==1:
matrixes()
答案 0 :(得分:0)
关于如何构造矩阵,您的代码有些混乱。之所以要获得特定的IndexError
是因为循环中的i
和j
实际上是数组,可以看到是否插入了print
语句。您的代码仍然存在其他一些问题,但是我将提供一个解决方案,让您根据需要调试其余部分。
这是您可以用来获取所需工作流程的基本框架。我将插入任意值而不是input()
语句以使示例可重现,但是根据需要用input()
替换它们应该很简单:
n_col = 3
n_row = 4
arr = np.zeros((n_row, n_col), dtype=int) # <-- Create the matrix here
arr
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
现在用嵌套循环填充数组:
for i in np.arange(n_col):
for j in np.arange(n_row):
a = np.random.randint(5) # <-- replace with input()
arr[j, i] = a
arr
array([[0, 1, 3],
[4, 0, 3],
[1, 0, 1],
[3, 4, 0]])
答案 1 :(得分:0)
construct a Numpy array的最常见选项是(当然)np.array
,
像这样描述
numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
Create an array.
您可能想研究整个说明,但最相关的是object
参数-再次来自参考说明
参数:对象:array_like
一个数组,任何暴露数组接口的对象,一个其对象
__array__
方法返回一个数组或任何(嵌套的)序列。
尤其是可以使用list comprehension构建的“任何(嵌套)序列”,例如,您可以构建类似这样的列表列表
>>> [[input() for col in range(3)] for row in range(2)]
1
2
3
4
5
6
[['1', '2', '3'], ['4', '5', '6']]
>>>
并将所述列表传递给array
构造函数(在注意到我们需要将字符串转换为浮点数之后,即...)
>>> np.array([[float(input()) for col in range(3)] for row in range(2)])
...
array([[1., 2., 3.],
[4., 5., 6.]])
>>>
有了这些基础,我们就可以编写这段代码
nrows = int(input('How many rows? '))
ncols = int(input('How many columns? '))
A = np.array([[float(input('Enter element for row %d and column %d: '%(row,col)))
for col in range(ncols)] for row in range(nrows)])
值得一提的是,这样做会产生一个可能
(不,这不是您的情况...)将要包含的大量列表
垃圾收集,因此,如果效率是主要问题,
使用np.empty((nrows, ncols))
创建一个空矩阵,然后
最好使用循环来填充您的值:
nr = int(input('How many rows? '))
nc = int(input('How many columns? '))
A = np.empty((nr, n)) # note that the argument is the tuple (nr, nc)
for r in nr:
for c in nc:
A(r, c) = float(input('A(%d, %d) = '%(r, c)))
作为旁注,可能最好将input
调用包装在两个
内部循环成一个函数,反复询问您的输入,直到
它提供了一个有效的号码
def real_input(prompt)
while 1:
str_val = input(prompt)
try:
num_val = real(str_val)
except ValueError:
# optionally print error message
continue
return num_val
使得您不必重新启动整个输入过程 一个错误。