2014-02-14 45 views
0

當您通讀此問題時,您會看到我是Python和NumPy的新手,因此請原諒任何不正確的術語。在Numpy數組中設置新屬性

我目前正在使用兩個NumPy陣列,我們稱它們爲xy

x = numpy.array(0) 
y = numpy.array(0) 

我正在對這些數組進行操作,這些數組具有這些數組作爲輸入和輸出。

x, y = function1(x, y) 
x, y = function2(x, y) 
... 

這似乎不雅,因爲如果我可以讓他們在同一對象的部分,那我就只有一個輸入和輸出這些功能。如果可能,我只想簡化代碼。

x = function1(x) 
x = function2(x) 
... 

事實證明,y描述x數據(而不是在這個玩具的例子,但我的實際陣列),所以我想我會設置yx屬性。我的母語是MATLAB,我想我可以使用類似於創建結構層次結構的語法。

x.y = y 

這不起作用,不幸的是,我不知道足夠的Python術語知道要尋找什麼,在網上找到一個解決我的問題。

請讓我知道,如果您有任何建議和/或如果我可以提供任何關於這個問題的澄清。

+0

爲什麼你告訴我們,一個最小的*完整*例如,你在做什麼目前,說幾句話*爲什麼*您覺得目前的做法不滿意? – NPE

+0

我不明白你的問題,NPE。你想要一個不完整的例子?我可以使數據更真實,但是你上面看到的將會重現我得到的錯誤。 –

+1

看到[這](http://stackoverflow.com/questions/1529002/cant-set-attributes-of-object-class)我不認爲這可以完成沒有子類化numpy數組。 – M4rtini

回答

1

我認爲你得到的錯誤是沿着'array' object has no attribute 'y'的線。

在這種情況下,如果你真的想把這些東西捆綁在一起,我建議使用一個元組。這裏是他們是如何爲您的使用情況下,工作的一些例子:

def myFunc1(x, y): 
    # do stuff with x and y 
    return ??? # x or y or... both, somehow? 

def myFunc2(xy_bundle): # where xy_bundle is x and y packed into a tuple! 
    x, y = xy_bundle # or: x = xy_bundle[0]; y = xy_bundle[1]; 
    # do stuff with x and y 
    return (x, y)  # syntax for creating a tuple inline 

您可以使用tup[x]符號來訪問元組的各個成員,就像一個列表或數組,或者你可以隱unpack它們,如myfunc2所。元組是用於通過函數移動多個事物的非常標準的工具,但是如果您發現自己使用了很多元素,那麼您可能會遇到自定義類或其他類的情況。

正如在評論中所說的,目前還不清楚你想將數組作爲另一個數組的屬性的動機,但對我來說這似乎是個壞主意。如果你有相互依賴的數組,你可以將大熊貓'array分類並添加一個property。但似乎過於複雜。

編輯:調用這些東西!您的代碼可能看起來像:

new_x = do_thing_with_array(x) 
new_y = do_thing_with_array(y) 

這一般會更改爲:

arrs = (x, y) 
new_x, new_y = do_thing_with_arrays(arrs) 

希望這就是你要找的人。

+0

謝謝,p!我將不得不查看已有的類如NumPy數組的自定義類。否則,我會嘗試你提到的捆綁包。只是好奇,爲什麼這對你來說似乎不是個好主意?試圖瞭解如何編寫更好的Python代碼。我的主要動機是讓更少的變量浮在我的工作區周圍,並將更少的變量傳遞給我的函數,從而獲得更優雅的代碼。 –

1

你可以創建一個簡單的類來保存這樣的數組。

class Xy(object): 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

import numpy as np 

x = np.array(range(10)) 
y = np.array(range(10)) 

xy = Xy(x,y) 

def square(xy): 
    x = xy.x 
    y = xy.y 

    x **= 2 
    y **= 2 

    return Xy(x,y)