YOLO813

Numpy学习(2)-数组的合并+统计函数+随机数

    numpy的合并。

a = np.arange(4).reshape(2,2)
a
>array([[0, 1],
       [2, 3]])
b = np.arange(4,8).reshape(2,2)
b
>array([[4, 5],
       [6, 7]])
# np.concatenate?
# Join a sequence of arrays along an existing axis.
# 沿现有轴连接一系列数组,接收的是列表或者元组
np.concatenate((a,b),axis=0)
>array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])
#默认的axis=0,即沿着行合并
#原本是两行,合并后变为4行
#设置axis=1
np.concatenate((a,b),axis=1)
>array([[0, 1, 4, 5],
       [2, 3, 6, 7]])
#可以发现行数未变,列数增加了

#concatenate在现有轴上链接数组
#而stack在新轴上链接
#np.stack(arrays, axis=0, out=None)
#Join a sequence of arrays along a new axis.
#The ``axis`` parameter specifies the index of the new axis in the
#dimensions of the result. For example, if ``axis=0`` it will be the first
#dimension and if ``axis=-1`` it will be the last dimension.
c = np.arange(4)
d = np.arange(4,8) # array([4, 5, 6, 7])
np.stack((c,d),axis=0) # 从一维变成了二维
>array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
np.stack((c,d),axis=-1)
>array([[0, 4],
       [1, 5],
       [2, 6],
       [3, 7]])

# 如何对numpy数组去重
x = np.array([1,2,1,3,1])
np.unique(x)
>array([1, 2, 3])

    简单的运算

#开根
np.sqrt(x)
#正弦函数
#直角三角形中,任意一锐角∠A的对边与斜边的比叫做∠A的正弦,记作sinA
#(由英语sine一词简写得来),即sinA=∠A的对边/斜边。
np.sin(x)
np.add(a,b)
np.subtract(a,b)
# 余数 Return element-wise remainder of division.
np.mod(b,a)
#地板除
b//a

# 比较大小
b>a
>array([[ True,  True],
       [ True,  True]])
# 对bool值取反,左上角tab按键上面的符号
~(b>a)
>array([[False, False],
       [False, False]])


    统计函数

np.random.randn?
#生成一组符合正态分布的样本
#Return a sample (or samples) from the "standard normal" distribution.
a = np.random.randn(2,4)
a
> array([[-2.48893647, -1.78218107, -0.350778  ,  0.48972934],
       [ 0.017733  ,  0.02102483, -1.41657751,  0.49500057]])
# 计算平均值的顶级方法
np.mean(a)
# 等价于 a.mean()

#求和 Return the sum of the array elements over the given axis.
a.sum()
#假如想要每列数据相加的结果,我们可以指定axis
#指定了axis=1,则让该行数据中的每1列 值相加
a.sum(axis=1)
>array([-4.1321662 , -0.88281911])
#如果想要让其每行数据相加,则定义axis为0
a.sum(axis=0)
>array([-2.47120347, -1.76115624, -1.76735551,  0.98472991])

#求最大值
a.max()    a.min()
#如果想求每一列的最大值,也可以指定axis
#例如获取第每行的所有列最大值
a.max(axis=1)
>array([0.48972934, 0.49500057])

#标准差 是离均差平方的算术平均数(即:方差)的算术平方根
#标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同
#两组数的集合{0,5,9,14}和{5,6,8,9}其平均值都是7,但第二个集合具有较小的标准差
#标准差可以当作不确定性的一种测量
a.std()

#中位数。于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。
#如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
x = np.array([1,2,3,4])
np.median(x)
>2.5

#累加,我指定了沿着0轴相加,则第一行不变
f = np.arange(12).reshape(4,3)
f
>array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
np.cumsum(f,axis=0)
>array([[ 0,  1,  2],
       [ 3,  5,  7],
       [ 9, 12, 15],
       [18, 22, 26]], dtype=int32)

#累乘
np.cumprod(f,axis=1)
>array([[  0,   0,   0],
       [  3,  12,  60],
       [  6,  42, 336],
       [  9,  90, 990]], dtype=int32)

#bool运算
a>0
>array([[False, False, False,  True],
       [ True,  True, False,  True]])
sum(a>0)
>array([1, 1, 0, 2])
np.sum(a>0)
>4

# any和all
np.any(a>0)
np.all(a>0)


    如何排序

#测试数据
array([[ 0.31054464, -1.73944131,  0.12858845, -0.88231938],
       [-0.35603066,  0.36240506, -0.57767118, -0.23748804],
       [-0.10669898, -0.18489163, -0.04563951, -0.31773017]])
# 实例方法a.sort()默认会修改原始数据,按列大小进行排序
# 默认axis=-1
a.sort()
a
array([[-1.73944131, -0.88231938,  0.12858845,  0.31054464],
       [-0.57767118, -0.35603066, -0.23748804,  0.36240506],
       [-0.31773017, -0.18489163, -0.10669898, -0.04563951]])

# 按照行的大小来进行排序
a.sort(0)
a
>array([[-1.73944131, -0.88231938, -0.23748804, -0.04563951],
       [-0.57767118, -0.35603066, -0.10669898,  0.31054464],
       [-0.31773017, -0.18489163,  0.12858845,  0.36240506]])

# 如果不想修改原始数据,可以考虑使用顶级方法
# np.sort(a,axis=0)只会返回一个拷贝的副本

# argsort只返回索引
d = np.array([1,4,3,6])
np.argsort(d)
>array([0, 2, 1, 3], dtype=int64)
d[np.argsort(d)]
>array([1, 3, 4, 6])

# 返回最小值、最大值的索引
np.argmax(d)
>3


    numpy中的随机数

#生成正态(高斯)分布的样本
#Draw random samples from a normal (Gaussian) distribution.
#normal(loc=0.0, scale=1.0, size=None)
a = np.random.normal(size=(3,5))
a
>array([[ 0.45831795, -0.75755478, -1.55813967, -0.08393352,  1.09949068],
       [ 1.9000072 ,  0.61350504,  0.17975944, -0.66229397, -0.94594314],
       [-1.72637865,  0.28861706,  0.13129755,  1.43255899,  0.60143643]])

# 标准正态分布
# Return a sample (or samples) from the "standard normal" distribution.
b = np.random.randn(3,5)
b

# 自然随机数
# randint(low, high=None, size=None, dtype=int)
# Return random integers from `low` (inclusive) to `high` (exclusive).
c = np.random.randint(3,size=(3,4))
c
>array([[0, 1, 1, 0],
       [2, 2, 2, 2],
       [1, 1, 2, 0]])
c = np.random.randint(3,high=10,size=(3,4))
c
>array([[7, 9, 4, 7],
       [4, 3, 7, 4],
       [7, 4, 7, 8]])

#从给定数组中随机抽取样本
#choice(a, size=None, replace=True, p=None)
d =np.random.choice(10)
#a If an int, the random sample is generated as if a were np.arange(a)
d
>5
d =np.random.choice([1,2.5,3,4])
#a If an ndarray, a random sample is generated from its elements.
d
>2.5

# 生成乱序数组
# np.random.permutation(x)
# Randomly permute a sequence, or return a permuted range.
# If `x` is an integer, randomly permute ``np.arange(x)``.
# 也就是说如果x为一个整形,那么就相当于把np.arange(x)拿来乱序
e = np.arange(5,15)
e
>array([ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
np.random.permutation(e)
>array([11, 10, 12,  5,  8, 14,  9,  7,  6, 13])

#如果我们想通过一个索引将两个不相关的数组建立连接
#也可以采用这种方法,例如
a = np.random.randn(10)
a
>array([-0.01077067, -0.08901414, -0.18358072, -0.35879772, -0.77724899,
       -0.62502643,  0.27090924,  0.51421126,  0.91220103, -0.81712427])

index=np.random.permutation(len(a))
# 这种写法上面已经介绍过了,里面的len(a)相当于np.arange(x)
>array([0, 6, 7, 8, 3, 4, 1, 2, 9, 5])
a[index]
#通过随机索引获得乱序的a数组
>array([-0.08901414, -0.81712427, -0.77724899, -0.18358072, -0.35879772,
        0.91220103,  0.27090924, -0.01077067,  0.51421126, -0.62502643])
#通过同一个index我们可以将一个新数组b与a对应起来

#通过seed生成固定的随机数
np.random.seed(12)
np.random.randn(5)
>array([ 0.47298583, -0.68142588,  0.2424395 , -1.70073563,  0.75314283])


    numpy中的逻辑运算,在numpy中可以利用where语句将条件判断转化成数据运算。

where(condition, [x, y])
Return elements chosen from `x` or `y` depending on `condition`.
Parameters
----------
condition : array_like, bool
    Where True, yield `x`, otherwise yield `y`.
x, y : array_like
    Values from which to choose. `x`, `y` and `condition` need to be
    broadcastable to some shape.
Returns
-------
out : ndarray
    An array with elements from `x` where `condition` is True, and elements
    from `y` elsewhere.

    示例如下:

a = np.arange(5)
b = np.array([20,10,0,30,50])
c = [True,True,True,False,False]
np.where(c, a, b)
> array([ 0,  1,  2, 30, 50])


    保存数组到文件中;从文件中读取数据

np.save(file, arr, allow_pickle=True, fix_imports=True)
Docstring:
Save an array to a binary file in NumPy ``.npy`` format.

np.load?
np.load(
    file,
    mmap_mode=None,
    allow_pickle=False,
    fix_imports=True,
    encoding='ASCII',
)

e.g

np.save('test',a)
np.load('test.npy')