在随机生成的numpy数组中创建元组

时间:2011-10-21 03:46:58

标签: python

家庭作业任务听起来像这样

  

生成4 * n均匀整数的随机向量,范围为1   到6,将这个向量重塑为一个有四行n列的数组,   用四个骰子代表n投掷的结果......

我提出了以下解决方案:

import numpy as np

num = 10
v = np.random.randint(1,7,(num,4))

到目前为止一切都那么好,但我注意到我生成的数组在创建时处于4 x n形状,并且尚未重新整形。我也考虑过以下几点:

v = np.random.randint(1,7,(4*num))
z = np.reshape(v,(num,-4))

这两者在构建v方面有区别吗?从几个印刷语句中,它们看起来是相同的(在形状方面),但我无法理解文档。

1 个答案:

答案 0 :(得分:1)

两种方式都是等效的,尽管你的家庭作业似乎需要先创建一维阵列,然后再将其重塑为二维。

v = np.random.randint(1, 7, (num, 4))

NumPy为num*4整数分配单个内存块,用从[1, 7)区间统一绘制的随机值填充它们,然后返回一个数组,将该1D数组解释为“C-contiguous”2D包含num行和4列*。

的数组
v = np.random.randint(1, 7, 4 * num)
z = np.reshape(v, (num, 4))

这是做同样的事情,但更明确地说:v仍然是一维数组,zv上的视图,解释相同数据为二维数组。这意味着更改v中的值也会在z中更改它,因为两个数组都指向相同的内存。

z = np.reshape(v, (num, -4))

-4没有意义 - 数组维度不能为负数。 NumPy 支持一个维度采用特殊值-1,这意味着“从数组大小自动推断维度”。它似乎也接受其他负数用于同一目的,但这是一个无证件的功能。这意味着它可能也是一个错误,并从未来的版本中删除。要么将其重新整理为(num, 4),要么使用(num, -1)让NumPy自动发现4。

另请注意,您的作业显示“四行和n列”,而您的数组将包含num行和4列。


*)例如,1D数组[ 1 2 3 4 5 6 7 8 ]被重新整形为:

[ 1 2 3 4 ]
[ 5 6 7 8 ]