我正在尝试在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()。我不想使用其中任何一个,因为我想比较一个特定实例的实际值。还有另外一种解决这个问题的方法吗?
答案 0 :(得分:2)
您需要告诉我们一些事情: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]):
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])
这可能并不完美,因为考虑到你缺少某些部分,很难解析你的逻辑。但希望您可以采用我在此处包含的一些内容并改进您的代码。