遍历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()。我不想使用其中的任何一个,因为我正在比较该特定实例的实际值。有没有解决这个问题的另一种方法?
你需要告诉我们一些关于这一点:dataset = datas.values
这可能是一个二维数组,因为它从一个CSV的负载派生的。但是什么形状和dtype?甚至可能是阵列的一个样本。
难道是data
参数中的函数吗?
什么是blackKings
和values
?你把他们当作名单(与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])
这可能不是完美的,因为它是很难分析你的逻辑考虑你是缺少一些作品。但希望你能采纳一些我在这里包含的内容并改进你的代码。
远离'np.append'。它是邪恶的。 – hpaulj
@hpaulj不,认真?!难以处理?或破碎? – piRSquared
'np.append'起作用,但人们在很多方面滥用它。例如,你似乎认为它像列表追加一样就地工作。它没有。它只是'np.concatenate'的一个覆盖函数。 – hpaulj
您可以通过发布确切的错误和完整的堆栈跟踪来帮助我们。 –
如果您创建[Minimal,Complete,and Verifiable](http://*.com/help/mcve)示例,它可以让我们更容易地为您提供帮助。 –
这个错误通常出现在'if'语句中。你应该检查''if data [i] [39] == 1:'语句。我的猜测是'data [i] [39]'返回一个索引值对。打印出来并检查。另外总是尝试使用'data.loc [39,i]'代替。 – salomonvh