家庭作业任务听起来像这样
生成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方面有区别吗?从几个印刷语句中,它们看起来是相同的(在形状方面),但我无法理解文档。
答案 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
仍然是一维数组,z
是v
上的视图,解释相同数据为二维数组。这意味着更改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 ]