遍历Python中的二维数组?

问题描述:

我想通过Python中的二维数组迭代,并将数组中的项与int进行比较,但是每当我尝试这样做时,都面临着大量的各种错误。我正在使用numpy和熊猫。遍历Python中的二维数组?

filename = "C:/Users/User/My Documents/JoeTest.csv" 
datas = pandas.read_csv(filename) 
dataset = datas.values 

于是,我试图去通过数据,抓住它的某些元素:

我的数据集如下创建。

def model_building(data): 
global blackKings 
flag = 0; 
blackKings.append(data[0][1]) 
for i in data: 
    if data[i][39] == 1: 
     if data[i][40] == 1: 
      values.append(1) 
     else: 
      values.append(-1) 
    else: 
     if data[i][40] == 1: 
      values.append(-1) 
     else: 
      values.append(1) 
    for j in blackKings: 
     if blackKings[j] != data[i][1]: 
      flag = 1 
    if flag == 1: 
     blackKings.append(data[i][1]) 
     flag = 0; 

然而,这样做留给我一个ValueError:具有多于一个元素的数组的真值是不明确的。使用a.any()或a.all()。我不想使用其中的任何一个,因为我正在比较该特定实例的实际值。有没有解决这个问题的另一种方法?

+2

您可以通过发布确切的错误和完整的堆栈跟踪来帮助我们。 –

+1

如果您创建[Minimal,Complete,and Verifiable](http://*.com/help/mcve)示例,它可以让我们更容易地为您提供帮助。 –

+0

这个错误通常出现在'if'语句中。你应该检查''if data [i] [39] == 1:'语句。我的猜测是'data [i] [39]'返回一个索引值对。打印出来并检查。另外总是尝试使用'data.loc [39,i]'代替。 – salomonvh

你需要告诉我们一些关于这一点:dataset = datas.values

这可能是一个二维数组,因为它从一个CSV的负载派生的。但是什么形状和dtype?甚至可能是阵列的一个样本。

难道是data参数中的函数吗?

什么是blackKingsvalues?你把他们当作名单(与append)。

for i in data: 
    if data[i][39] == 1: 

这没有意义。 for i in data,如果data是2D,i是第一排,然后第二行,等等。如果你在一个索引要i来,你使用类似

for i in range(data.shape[0]): 

二维数组索引通常与data[i,39]完成。

但在你的情况下,data[i][39]可能是一个数组。

无论何时在if声明中使用数组,您将得到这个ValueError,因为有多个值。

如果i是合适的索引,那么data[i,39]将是单个值。

为了说明:

In [41]: data=np.random.randint(0,4,(4,4)) 
In [42]: data 
Out[42]: 
array([[0, 3, 3, 2], 
     [2, 1, 0, 2], 
     [3, 2, 3, 1], 
     [1, 3, 3, 3]]) 
In [43]: for i in data: 
    ...:  print('i',i) 
    ...:  print('data[i]',data[i].shape) 
    ...:  
i [0 3 3 2]   # 1st row 
data[i] (4, 4) 
i [2 1 0 2]   # a 4d array 
data[i] (4, 4) 
... 

i这里是4元件阵列;使用它来索引data[i]实际上会产生一个4维数组;它不是选择一个值,而是选择很多值。

相反,你需要以下列方式之一进行迭代:

In [46]: for row in data: 
    ...:  if row[3]==1: 
    ...:   print(row) 
[3 2 3 1] 
In [47]: for i in range(data.shape[0]): 
    ...:  if data[i,3]==1: 
    ...:   print(data[i]) 
[3 2 3 1] 

要调试这样,你需要看中间值的一个问题,尤其是它们的形状。不要只假设。检查!

我要去尝试重写你的函数

def model_building(data): 
    global blackKings 
    blackKings.append(data[0, 1]) 

    # Your nested if statements were performing an xor 
    # This is vectorized version of the same thing 
    values = np.logical_xor(*(data.T[[39, 40]] == 1)) * -2 + 1 

    # not sure where `values` is defined. If you really wanted to 
    # append to it, you can do 
    # values = np.append(values, np.logical_xor(*(data.T[[39, 40]] == 1)) * -2 + 1) 

    # Your blackKings/flag logic can be reduced 
    mask = (blackKings[:, None] != data[:, 1]).all(1) 
    blackKings = np.append(blackKings, data[:, 1][mask]) 

这可能不是完美的,因为它是很难分析你的逻辑考虑你是缺少一些作品。但希望你能采纳一些我在这里包含的内容并改进你的代码。

+0

远离'np.append'。它是邪恶的。 – hpaulj

+0

@hpaulj不,认真?!难以处理?或破碎? – piRSquared

+0

'np.append'起作用,但人们在很多方面滥用它。例如,你似乎认为它像列表追加一样就地工作。它没有。它只是'np.concatenate'的一个覆盖函数。 – hpaulj