2017-04-20 131 views
1

我想通過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://stackoverflow.com/help/mcve)示例,它可以讓我們更容易地爲您提供幫助。 –

+0

這個錯誤通常出現在'if'語句中。你應該檢查''if data [i] [39] == 1:'語句。我的猜測是'data [i] [39]'返回一個索引值對。打印出來並檢查。另外總是嘗試使用'data.loc [39,i]'代替。 – salomonvh

回答

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

二維數組索引通常與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] 

要調試這樣,你需要看中間值的一個問題,尤其是它們的形狀。不要只假設。檢查!

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

這可能不是完美的,因爲它是很難分析你的邏輯考慮你是缺少一些作品。但希望你能採納一些我在這裏包含的內容並改進你的代碼。

+0

遠離'np.append'。它是邪惡的。 – hpaulj

+0

@hpaulj不,認真?!難以處理?或破碎? – piRSquared

+0

'np.append'起作用,但人們在很多方面濫用它。例如,你似乎認爲它像列表追加一樣就地工作。它沒有。它只是'np.concatenate'的一個覆蓋函數。 – hpaulj