迭代Python中的二维数组?

时间:2017-04-20 05:12:28

标签: python arrays pandas numpy

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

我的数据集创建如下:

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:具有多个元素的数组的Truth值是不明确的。使用a.any()或a.all()。我不想使用其中任何一个,因为我想比较一个特定实例的实际值。还有另外一种解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:2)

您需要告诉我们一些事情: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]):

2d数组索引通常使用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]

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

答案 1 :(得分:0)

我将尝试重写你的功能

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])

这可能并不完美,因为考虑到你缺少某些部分,很难解析你的逻辑。但希望您可以采用我在此处包含的一些内容并改进您的代码。