np.zeros可以创建一个元素全0的ndarray,np.ones则可以创建一个元素全1的ndarray。创建的时候可以指定ndarray的shape形状,也可以通过dtype属性指定内部元素的数据类型:
In [70]: np.zeros([2,3,2], dtype=np.float32) Out[70]: array([[[0., 0.], [0., 0.], [0., 0.]], [[0., 0.], [0., 0.], [0., 0.]]], dtype=float32) In [71]: np.ones([3,2,2], dtype=np.float32) Out[71]: array([[[1., 1.], [1., 1.]], [[1., 1.], [1., 1.]], [[1., 1.], [1., 1.]]], dtype=float32)另外,在Tensorflow中可以通过tf.fill产生指定元素的指定shape张量,如下产生2x3的张量,且内部元素为100:
In [76]: import tensorflow as tf In [77]: tf.fill([2,3], 100) Out[77]: <tf.Tensor: shape=(2, 3), dtype=int32, numpy= array([[100, 100, 100], [100, 100, 100]])>而在NumPy中,也有fill接口,只不过只能通过已有的ndarray才能调用fill,而无法直接np.fill进行调用:
In [79]: data = np.zeros([2, 3]) In [80]: data.fill(100) In [81]: data Out[81]: array([[100., 100., 100.], [100., 100., 100.]])np.arange与常用的range作用类似,用于产生一个固定区间连续的ndarray,注意取左不取右,且数组之间成一个等差数列,公差可自行定义(可为小数),如下:
In [85]: np.arange(10) Out[85]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) In [86]: np.arange(3, 10, 2) Out[86]: array([3, 5, 7, 9]) In [87]: np.arange(3, 10, 0.7) Out[87]: array([3. , 3.7, 4.4, 5.1, 5.8, 6.5, 7.2, 7.9, 8.6, 9.3])numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,可以指定元素内部元素的个数以及是否包含stop值。如下,在区间1-5中创建一个元素数目为10的等差数列:
In [89]: np.linspace(1, 5, 10) # 默认包含stop Out[89]: array([1. , 1.44444444, 1.88888889, 2.33333333, 2.77777778, 3.22222222, 3.66666667, 4.11111111, 4.55555556, 5. ]) In [90]: np.linspace(1, 5, 10, endpoint = False) # endpoint属性可以设置不包含stop Out[90]: array([1. , 1.4, 1.8, 2.2, 2.6, 3. , 3.4, 3.8, 4.2, 4.6])np.random.random和np.random.rand随机从0-1中生成对应shape的ndarray对象:
In [4]: np.random.random([3, 2]) Out[4]: array([[0.68755531, 0.56727707], [0.86027161, 0.01362836], [0.56557302, 0.94283249]]) In [5]: np.random.rand(2, 3) Out[5]: array([[0.19894754, 0.8568503 , 0.35165264], [0.75464769, 0.29596171, 0.88393648]])np.random.randint随机生成指定范围的ndarray,且内部元素为int类型:
In [6]: np.random.randint(0, 10, [2, 3]) Out[6]: array([[0, 6, 9], [5, 9, 1]])np.random.randn返回满足标准正态分布的ndarray(均值为0,方差为1):
In [7]: np.random.randn(2,3) Out[7]: array([[ 2.46765106, -1.50832149, 0.62060066], [-1.04513254, -0.79800882, 1.98508459]])另外,我们在NumPy中使用random的时候,都是随机产生的一组数据,而要想每次产生的数据相同,则需要通过np.random.seed来进行设置:
In [33]: np.random.seed(100) In [34]: np.random.randn(2, 3) Out[34]: array([[-1.74976547, 0.3426804 , 1.1530358 ], [-0.25243604, 0.98132079, 0.51421884]]) In [35]: np.random.seed(100) In [36]: np.random.randn(2, 3) Out[36]: array([[-1.74976547, 0.3426804 , 1.1530358 ], [-0.25243604, 0.98132079, 0.51421884]])在NumPy中的一维ndarray里,就如同列表一样操作,可以对其进行切片和遍历等操作:
In [5]: a Out[5]: array([1., 2., 3., 4., 5., 6., 7., 8., 9.]) In [6]: a[2], a[2:5] Out[6]: (3.0, array([3., 4., 5.])) In [7]: a * 3, a ** 3 # 立方 Out[7]: (array([ 3., 6., 9., 12., 15., 18., 21., 24., 27.]), array([ 1., 8., 27., 64., 125., 216., 343., 512., 729.])) In [13]: for i in a: ...: print(i, end=", ") 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,假如我们的ndarray并非是一维数组,而是二维矩阵,或是更高维度的ndarray,则我们需要对其进行多维度的切分。且当我们对高维度的ndarray进行遍历的时候,则遍历出单个结果的维度比元维度少一,比如2维矩阵遍历得到的结果为1维向量,三维遍历的结果为2维矩阵。