簡體   English   中英

numpy數組與列表列表?

[英]numpy array vs list of lists?

編輯:我已將np.array更改為np.arange以更好地解釋我的問題是什么。

作為Python的新手,我仍然在數據結構方面苦苦掙扎。 看來這應該是一個非常明顯(而且顯然是重復的)的問題,但我對其他解釋不夠了解,無法使其正常工作。

我需要創建一個列表列表(和/或數組,我將在稍后解釋),所有列表的長度和范圍都不同。 我通過以下方式設置了初始數組,但我仍然不知道如何創建“ partotal”數組。 我知道語法是錯誤的,但仍然不明白為什么。

import numpy as np

par1 = np.arange([10,80,1])
par2 = np.arange([50,120,1])
par3 = np.arange([0,40,1])
par4 = np.arange([0,30,1])

partotal = np.array([par1][par2][par3][par4])

您可能已經猜到了,第二個問題是我不知道是否應該使用numpy數組,列表列表,熊貓或完全使用其他東西。 由於所有數組的長度不同,因此很難理解如何將它們放在一起或再次將其刪除。

編輯: partotal的目的是為另一個功能創建一組起始位置(請參見下文)

inputnumber = 200

def positions(partotal, inputnumber):
    return np.random.uniform(partotal, size=(inputnumber, len(partotal)))

我知道這聽起來很基礎,但是作為一個初學者,我感到困惑和困難。 大多數答案都集中在語法上,無助於獲得真正的見識。 如果有人可以花一些時間解釋非常明顯的事情,我將不勝感激。

最終編輯:當我了解自己的問題時,答案非常簡單。 為了避免其他人可能需要遵循我的思考過程,我不會刪除帖子的其余部分。

par = 3
par1 = np.random.uniform(10,80,size=par)
par2 = np.random.uniform(5,120,size=par)
par3 = np.random.uniform(0,40,size=par)

allpar = np.array([par1,par2,par3])

如果您要創建2d數組,則可以將2d列表傳遞給np.array

np.array([[10, 80, 1], [50, 120, 1], [0, 40, 1], [0, 30, 1]])

不知道這是您要做什么,但是在您的特定情況下,您可以這樣做:

partotal = np.array([par1, par2, par3, par4])

的一個常見用途uniform是指定標量startstop的值,和一個形狀:

In [101]: np.random.uniform(0,1,size=(3,4))
Out[101]: 
array([[0.87953793, 0.83726369, 0.53280941, 0.69611469],
       [0.78369061, 0.99258945, 0.65533223, 0.8342177 ],
       [0.69943211, 0.53965698, 0.06419811, 0.36591087]])

這是從[0,1)中抽取的12個值,排列為(3,4)數組。

docs說startstop可以是數組,但是不清楚如何使用它們。 最好的線索是:

np.broadcast(low, high).size樣本。

因此,嘗試(3,1)和(1,4)輸入,我們再次獲得(3,4)數組。

In [102]: np.random.uniform(np.zeros((3,1)), np.ones((1,4)))
Out[102]: 
array([[0.35865707, 0.39068231, 0.9117642 , 0.49346499],
       [0.1439195 , 0.1217748 , 0.21780452, 0.83235673],
       [0.24894503, 0.36413268, 0.51516651, 0.8480244 ]])

要分別從(0,1),(10,11)和(20,21)生成3個數字:

In [105]: np.random.uniform(np.arange(0,30,10), np.arange(1,31,10))
Out[105]: array([ 0.54715093, 10.75390957, 20.98101312])

我不知道您想用這4個數組做什么。

In [107]: par1 = np.arange(10,80)     # corrected usage
     ...: par2 = np.arange(50,120)
     ...: par3 = np.arange(0,40)
     ...: par4 = np.arange(0,30)

我可以將這四個數組合並為一個:

In [108]: par = np.concatenate([par1,par2,par3,par4])
In [109]: par.shape
Out[109]: (210,)

具有不同的長度,此hstack是唯一的選擇。

請注意,我構造了這些數組的列表,並將其用作concatenate的輸入(符合預期)。

In [110]: alist = [par1,par2,par3,par4]

列表列表或數組列表是簡單的Python構造。 在嘗試制作數組(大小不同)之前,一定要使用它。 但是我看不到這如何適用於uniform (正如我剛才說明的)。

另一個(3,4)隨機值數組:

In [111]: np.random.uniform(np.arange(3)[:,None], np.arange(4))
Out[111]: 
array([[0.        , 0.74651856, 0.60318064, 0.75254649],
       [0.49864947, 1.        , 1.60558937, 2.06444058],
       [1.03298196, 1.80321816, 2.        , 2.3358475 ]])

每個元素取自不同的范圍

 [0,0) [0,1) [0,2)
 [1,0) [1,1) [1,2)
 [2,0) ...

感謝大家在我意識到這是一個措辭極差的問題上所提供的幫助。 答案很簡單:

val = 4 # or any required number of start points
par1 = np.random.uniform(10,60,size=val)
par2 = np.random.uniform(0,20,size=val)
par3 = np.random.uniform(0,30,size=val)

allpar = np.array([par1,par2,par3])

這給了我一個正確值的數組,在指定的邊界內具有正確數量的隨機生成的點。

謝謝大家的貢獻。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM