numpy数组vs列表列表?

时间:2018-04-30 00:40:04

标签: python arrays list numpy

编辑:我已将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数组,列表列表,pandas还是完全不同的东西。由于我的所有数组都有不同的长度,我发现很难理解如何将它们放在一起或再次删除它们。

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

3 个答案:

答案 0 :(得分:0)

如果您尝试创建二维数组,则可以将二维列表传递给np.array

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

不确定这是否适合您,但在您的具体情况下,您可以这样做:

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

答案 1 :(得分:0)

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)数组排列。

它的文档说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)

我可以将这4个数组连接成一个:

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

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

这给了我一个正确值的数组,在指定的边界内有正确数量的随机生成的点。

感谢所有贡献的人。