所以我很努力使這個代碼更適用於更大的數據集。下面是代碼,我會徹底地再具體解釋:將迭代的值存儲到一個numpy數組 - Python,Numpy
import numpy as np
np.set_printoptions(threshold='nan')
tri_nums = [3, 2, 1]
paths = [1, 3, 4, 5]
vol_list = [10, 10, 10, 15, 15, 25]
n = 0
array_list = []
while n <= len(tri_nums):
for num in tri_nums:
print "assigning volume", vol_list[sum(tri_nums)-len(vol_list)+1]
volume_array = np.zeros(shape = (6, 6))
volume_array[paths[num-1],paths[num]] = vol_list[sum(tri_nums)-len(vol_list)+1]
array_list.append(volume_array)
print paths[num-1], paths[num]
tri_nums.pop(0)
paths.pop(0)
n+=1
print paths
print tri_nums
final_array = sum(array_list)
print array_list
print final_array
與tri_nums
開始: 的tri_nums
值將永遠是paths
長度的三角形號碼列表。所以paths
列表說,[1, 3, 4, 5, 6, 8]
,將提供tri_nums
[5, 4, 3, 2, 1]
。
tri_nums
也與vol_list
中的值的數目相關。如您所見,vol_list
中有三個10
。 10
的數量等於第一個值tri_nums
。對於第二個值tri_nums
,還有兩個15
和2
。這種模式永遠不會改變!另外一個例子是:
paths = [1, 3, 4, 5, 6, 8]
tri_nums = [5, 4, 3, 2, 1]
vol_list = [15, 15, 15, 15, 15, 250, 250, 250, 250, 25, 25, 25, 10, 10, 15]
列表paths
(在原始情況下)是由四個「節點」,節點1,3,4和5的每個相鄰節點之間存在一個路徑,即路徑1-3,3-4,4-5。可以看到,volume_array
是一個6x6數組,由零組成。 volume_array
中要更改的行值對應於每個路徑的第一個值,即1
,3
,4
。列值對應於每條路徑的第二數字,即3
,4
,5
。
這裏有棘手的一點!
- 對於
vol_list
一個值加到volume_array
tri_nums
的每個值:在
vol_list
的值如下所示被分配給前述數組項。該數組中的行值由路徑的第一個值定義,即[4]
,列值由路徑的第二個值定義(對於值[4]
,這將意味着[5]
)。 - 對於
tri_nums[0]
,將值10
添加三次,一次爲volume_array[4][5]
,一次爲volume_array[3][4]
,一次爲volume_array[1][3]
。 - 對於
tri_nums[1]
,值15
被添加兩次,一次到volume_array[4][5]
並且一次到volume_array[3][4]
。 - 對於
tri_nums[2]
,值25
被添加一次到volume_array[4][5]
。 - 最後,將前三步中生成的數組中的所有值加起來得到
final_array
。
值得一提的另一件事是tri_nums
的總和等於len(vol_list)
。此外tri_nums[n]
總是>tri_nums[n+1]
。
理想情況下,我想爲path
的tri_num
和vol_list
實現此代碼,其中包含數百個項目。我現在使用的方法意味着我需要手工製作數百個while循環。我怎樣才能使while
循環同時工作,這樣我就可以避免「數百個while while循環」情形?
一切工作得很好,但最終輸出是:
[[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 10. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 25. 0.]
[ 0. 0. 0. 0. 0. 25.]
[ 0. 0. 0. 0. 0. 0.]]
意思就是說的vol_list
的終值是(25
)尚未分配到array_list[4][5]
,因此不在final_array
。它只需要做一個循環,它會工作,我不知道如何讓它做最後一個循環。
請讓我知道,如果有什麼不清楚!
感謝
'list'是一個數據類型 - 它不應該被用作變量名(重命名它)。 '而count <1:'是多餘的,因爲如果你刪除它,你會得到相同的結果。如果您稍後想要多次迭代,則將其保留下來纔有意義。 – jDo
任何你可以用手做的事情你都可以用電腦做。想想你會用手去做的步驟。然後讓電腦做到這一點。有時讓電腦變得更難,但YMMV。 –
既然你問了,代碼示例有點長,說明也適度複雜。我認爲如果你將描述的各個部分與代碼的相應部分交織在一起,會產生更清晰的問題。在幾個地方添加示例輸出將有助於進一步提高。這就是說,我知道你在做什麼;讓我看看我能否拿出答案。 –