数据盲目分析(二)——numpy简单回顾(下)

314

这是我参与更文挑战的第2天,活动详情查看:更文挑战

numpy数组切片

切片的格式为[start:end:step]

import numpy as np

target = np.arange(9).reshape(3,3)

target[:, [0,2]]

注意:切片仍然为不包括end的切片,如果想要表达全部都是使用全部数据,可以使用[0:]的方式,当然0是可以省略的。 当end指定为-1或者为数组的最后一个索引时,是不包括end本身的。

同时,如代码所言,我们可以直接传入列表指定某个维度的索引进行切片。

则输出结果为

array([[0, 2],
       [3, 5],
       [6, 8]])

numpy数组索引

利用 np.ix_ 在对应的维度上使用布尔索引

import numpy as np

target = np.arange(9).reshape(3,3)

print(target[np.ix_([True, False, True], [True, False, True])])
target[np.ix_([1,2], [True, False, True])]

则有输出:

[[0 2]
 [6 8]]
array([[3, 5],
       [6, 8]])

前面的代码中通过直接写入布尔值列表,这种例子对我们是毫无助益的,np.ix_函数就是输入两个数组,产生笛卡尔积的映射关系。

import numpy as np

target = np.arange(25).reshape(5,-1)
print(target)
print("*\n")
print(target[np.ix_([2,3],[4,1,3])])
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
 *
[[14 11 13]
 [19 16 18]]

如果不通过np.ix_函数,则需要使用如下方式实现

print(target[[2,3]][:,[4,1,3]])

这样可读性就会比较差。

神奇的广播机制!

标量和数组的广播

import numpy as np

res = 4 * np.ones((2,2)) + 1
print(res)
res = 1 / res
res

输出为

[[5. 5.]
 [5. 5.]]
array([[0.2, 0.2],
       [0.2, 0.2]])

二维数组之间的操作

当两个数组维度完全一致时,则可以进行运算,否则会报错,除非其中的某个数组的维度是 m × 1 或者 1 × n ,那么会扩充其具有 1 的维度为另一个数组对应维度的大小。例如,1 × 2 数组和 3 × 2 数组做逐元素运算时会把第一个数组扩充为 3 × 2 ,扩充时按照扩充前的行(列)的对应数值进行赋值。需要注意的是,如果第一个数组 的维度是 1 × 3 ,那么由于在第二维上的大小不匹配且不为 1 ,此时报错。

import numpy as np

res = np.ones((3,2))
res *= np.array([2,3])
print(res)
res *= np.array([[2]])
print(res)
res *= np.array([2])
print(res)
res *= np.array(2)
res

以上代码可以纠正你对维度的理解,最后三个array从某种角度来说都是一行一列的二维数组。也自然可以经过两次上面描述的扩充行为。

一维数组与二维数组之间怎么操作呢?

要不你再看看前面几行?