如何在Python中使用np.zeros作为迭代器?

时间:2018-08-05 06:38:32

标签: python numpy

我试图用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()

2 个答案:

答案 0 :(得分:0)

关于如何构造矩阵,您的代码有些混乱。之所以要获得特定的IndexError是因为循环中的ij实际上是数组,可以看到是否插入了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

使得您不必重新启动整个输入过程 一个错误。