Python 数据分析三剑客之 NumPy(二):数组索引 / 切片 / 广播 / 拼接 / 分割

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个企业级项目。


NumPy 系列文章:

  • Python 数据分析三剑客之 NumPy(一):理解 NumPy / 数组基础
  • Python 数据分析三剑客之 NumPy(二):数组索引 / 切片 / 广播 / 拼接 / 分割
  • Python 数据分析三剑客之 NumPy(三):数组的迭代与位运算
  • Python 数据分析三剑客之 NumPy(四):字符串函数总结与对比
  • Python 数据分析三剑客之 NumPy(五):数学 / 算术 / 统计 / 排序 / 条件 / 判断函数合集
  • Python 数据分析三剑客之 NumPy(六):矩阵 / 线性代数库与 IO 操作

另有 Pandas、Matplotlib 系列文章已更新完毕,欢迎关注:

  • Pandas 系列文章:https://itrhx.blog.csdn.net/category_9780397.html
  • Matplotlib 系列文章:https://itrhx.blog.csdn.net/category_9780418.html

推荐学习资料与网站(博主参与部分文档翻译):

  • NumPy 官方中文网:https://www.numpy.org.cn/
  • Pandas 官方中文网:https://www.pypandas.cn/
  • Matplotlib 官方中文网:https://www.matplotlib.org.cn/
  • NumPy、Matplotlib、Pandas 速查表:https://github.com/TRHX/Python-quick-reference-table

文章目录

    • 【1x00】认识 Numpy 中的 nan 和 inf
      • 【1x01】判断是否为 nan 和 inf
      • 【1x02】统计数组中 nan 的个数
      • 【1x03】统计数组中 inf 的个数
      • 【1x04】替换 inf 和 nan
    • 【2x00】NumPy 索引
      • 【2x01】获取具体元素
      • 【2x02】获取行或列
      • 【2x03】布尔索引
      • 【2x04】花式索引
    • 【3x00】NumPy 切片
    • 【4x00】NumPy 数组运算以及广播原则
    • 【5x00】数组的拼接与元素的添加
      • 【5x01】将数组转换成列表,拼接完成再转换成数组
      • 【5x02】numpy.append()
      • 【5x03】numpy.concatenate()
      • 【5x04】numpy.stack()
      • 【5x05】numpy.vstack()
      • 【5x06】numpy.hstack()
      • 【5x07】numpy.dstack()
      • 【5x08】以上几种方法的区别
      • 【5x09】numpy.insert()
      • 【5x10】numpy.r_
      • 【5x11】numpy.c_
    • 【6x00】数组的分割与元素的删除
      • 【6x01】numpy.split()
      • 【6x02】numpy.array_split()
      • 【6x03】numpy.vsplit()
      • 【6x04】numpy.hsplit()
      • 【6x05】numpy.dsplit()
      • 【6x06】numpy.delete()
      • 【6x07】numpy.unique()


这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/104988137
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!

【1x00】认识 Numpy 中的 nan 和 inf

nan(NAN,Nan):全称 not a number,即不是一个数字
inf(-inf,inf):全称 infinity,inf 表示正无穷,-inf 表示负无穷

以下情况 Numpy 中会出现 nan:

  • 当读取本地的文件为 float 的时候,如果有缺失,就会出现 nan
  • 当做了一个不合适的计算的时候(如:无穷大减去无穷大)

以下情况会出现 inf 或者 -inf:

  • 比如一个数字除以 0,在 Python 中直接会报错,但在 Numpy 中则是一个 inf 或者 -inf

指定一个 nan 或者 inf:

>>> import numpy as np
>>> a = np.nan
>>> b = np.inf
>>> print(a)
nan
>>> print(b)
inf
>>> type(a)
<class 'float'>
>>> type(b)
<class 'float'>

注意两个 nan 并不相等,而两个 inf 是相等的

>>> np.nan == np.nan
False
>>> np.inf == np.inf
True

nan 和任何值计算都为 nan:

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4, 5])
>>> b = np.array([1, 2, np.nan, 4, np.nan])
>>> print(a+b)
[ 2.  4. nan  8. nan]

【1x01】判断是否为 nan 和 inf

  • isnan:判断元素是否为 nan(非数字)
  • isinf:判断元素是否为正无穷大或负无穷大
  • isposinf:判断元素是否为正无穷大
  • isneginf:判断元素是否为负无穷大
  • isfinite:判断元素是否为有限的(不是非数字,正无穷大和负无穷大中的一个)
>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [np.nan, 6, 7, np.nan], [9 ,np.nan, 10, 11]])
>>> print(a)
[[ 1.  2.  3.  4.][nan  6.  7. nan][ 9. nan 10. 11.]]
>>> np.isnan(a)
array([[False, False, False, False],[ True, False, False,  True],[False,  True, False, False]])

【1x02】统计数组中 nan 的个数

1、利用 np.count_nonzero 方法,结合两个 nan 不相等的属性,可以判断数组中 nan 的个数:

>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [np.nan, 6, 7, np.nan], [9 ,np.nan, 10, 11]])
>>> print(a)
[[ 1.  2.  3.  4.][nan  6.  7. nan][ 9. nan 10. 11.]]
>>> np.count_nonzero(a != a)    # 判断 nan 的个数,a != a 即为 nan,nan != nan
3

2、isnan() 方法可以判断哪些是 nan,再结合 np.count_nonzero 方法可以判断数组中 nan 的个数:

>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [np.nan, 6, 7, np.nan], [9 ,np.nan, 10, 11]])
>>> print(a)
[[ 1.  2.  3.  4.][nan  6.  7. nan][ 9. nan 10. 11.]]
>>> np.isnan(a)                        # np.isnan(a) 与 a != a 效果相同,判断那些是 nan
array([[False, False, False, False],[ True, False, False,  True],[False,  True, False, False]])
>>> np.count_nonzero(np.isnan(a))
3

3、利用 collections 模块的 Counter 方法来统计 nan 的个数(此方法仅适用于一维数组):

>>> from collections import Counter
>>> import numpy as np
>>> a = np.array([1, 2, np.nan, 4, np.nan])
>>> print(Counter(np.isnan(a)))
Counter({False: 3, True: 2})

【1x03】统计数组中 inf 的个数

1、isinf() 方法可以判断哪些是 inf,再结合 np.count_nonzero 方法可以判断数组中 inf 的个数:

>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [np.inf, 6, 7, -np.inf], [9 ,-np.inf, 10, 11]])
>>> print(a)
[[  1.   2.   3.   4.][ inf   6.   7. -inf][  9. -inf  10.  11.]]
>>> np.isinf(a)
array([[False, False, False, False],[ True, False, False,  True],[False,  True, False, False]])
>>> np.count_nonzero(np.isinf(a))
3

2、利用 collections 模块的 Counter 方法来统计 inf 的个数(此方法仅适用于一维数组):

>>> from collections import Counter
>>> import numpy as np
>>> a = np.array([1, 2, np.inf, 4, -np.inf])
>>> print(Counter(np.isinf(a)))
Counter({False: 3, True: 2})

【1x04】替换 inf 和 nan

numpy.nan_to_num() 方法可以将 nan 替换为零,将 inf 替换为有限数。

>>> import numpy as np
>>> a = np.array([[1, np.nan, 3, 4], [np.inf, 6, 7, -np.inf], [9 ,-np.inf, 10, np.nan]])
>>> print(a)
[[  1.  nan   3.   4.][ inf   6.   7. -inf][  9. -inf  10.  nan]]
>>> print(np.nan_to_num(a))
[[ 1.00000000e+000  0.00000000e+000  3.00000000e+000  4.00000000e+000][ 1.79769313e+308  6.00000000e+000  7.00000000e+000 -1.79769313e+308][ 9.00000000e+000 -1.79769313e+308  1.00000000e+001  0.00000000e+000]]

如果要将 nan 和 inf 替换成特定的值,则可以用以下方法:

>>> import numpy as np
>>> a = np.array([[1, np.nan, 3, 4], [np.inf, 6, 7, -np.inf], [9 ,-np.inf, 10, np.nan]])
>>> print(a)
[[  1.  nan   3.   4.][ inf   6.   7. -inf][  9. -inf  10.  nan]]
>>> loc_nan = np.isnan(a)
>>> loc_inf = np.isinf(a)
>>> a[loc_nan] = 111
>>> a[loc_inf] = 222
>>> print(a)
[[  1. 111.   3.   4.][222.   6.   7. 222.][  9. 222.  10. 111.]]

【2x00】NumPy 索引

【2x01】获取具体元素

NumPy 的索引和 Python 列表的索引类似,可以通过中括号指定索引获取第 i 个值(从 0 开始计数):

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4])
>>> print(a[0])
1
>>> print(a[2])
3
>>> print(a[-1])
4
>>> print(a[-2])
3

在多维数组中,可以用逗号分隔的索引元组获取具体某个元素:

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> print(a)
[[1 2 3][4 5 6][7 8 9]]
>>> print(a[1, 2])
6
>>> print(a[0, -2])
2
>>> a = np.array([[[1,2,3,4], [5,6,7,8]], [[9,10,11,12], [13,14,15,16]], [[17,18,19,20], [21,22,23,24]]])
>>> print(a)
[[[ 1  2  3  4][ 5  6  7  8]][[ 9 10 11 12][13 14 15 16]][[17 18 19 20][21 22 23 24]]]
>>> print(a[0, 1, 2])
7
>>> print(a[1, 0, -1])
12

【2x02】获取行或列

>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
>>> print(a)
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12]]
>>> print(a[1])       # 取一整行
[4 5 6]
>>> print(a[1, :])    # 取一整行,效果同上
[4 5 6]
>>> print(a[1, ...])  # 取一整行,效果同上
[4 5 6]
>>> print(a[:, 2])    # 取一整列
[ 3  6  9 12]
>>> print(a[..., 2])  # 取一整列,效果同上
[ 3  6  9 12]
>>> print(a[1:3])     # 取多行
[[4 5 6][7 8 9]]
>>> print(a[:, 0:2])  # 取多列
[[ 1  2][ 4  5][ 7  8][10 11]]
>>> print(a[[1, 3], :])  # 取第一、三行和所有列
[[ 4  5  6][10 11 12]]
>>> print(a[:, [0, 2]])  # 取第零、二列和所有行
[[ 1  3][ 4  6][ 7  9][10 12]]

【2x03】布尔索引

除了直接获取元素以外,还可以通过一个布尔数组来索引目标数组,即通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

以下实例将筛选出大于 6 的元素:

>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
>>> print(a)
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12]]
>>> print(a[a > 6])
[ 7  8  9 10 11 12]

以下实例使用取补运算符 ~ 来过滤掉 inf:

>>> import numpy as np
>>> a = np.array([1, 2, np.inf, 3, -np.inf, 4, 5])
>>> print(a)
[  1.   2.  inf   3. -inf   4.   5.]
>>> print(a[~np.isinf(a)])
[1. 2. 3. 4. 5.]

【2x04】花式索引

花式索引:传递一个索引数组来一次性获得多个数组元素,花式索引总是将数据复制到新数组中。

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

花式索引结果的形状与索引数组的形状一致,而不是与被索引数组的形状一致。

一维数组中的应用:

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6])
>>> print([a[0], a[2], a[-1]])
[1, 3, 6]
>>> import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6])
>>> ind = [0, 2, -1]
>>> print(a[ind])
[1 3 6]

二维数组中的应用:

>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> print(a)
[[ 1  2  3  4][ 5  6  7  8][ 9 10 11 12]]
>>> print([a[0, 1], a[1, 2], a[2, 3]])
[2, 7, 12]
>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> row = np.array([0, 1, 2])       # 行
>>> col = np.array([1, 2, 3])       # 列
>>> print(a[row, col])
[ 2  7 12]

【3x00】NumPy 切片

Ndarray 数组对象基于 0 - n 的下标进行索引,与 Python 中列表的切片操作一样,NumPy 的切片也可以通过冒号分隔切片参数 [start:stop:step] 来进行切片操作,另外,NumPy 也提供了一个内置函数 slice(start, stop, step) 来进行切片操作。

slice 方法应用:

>>> import numpy as np
>>> a = np.arange(10)
>>> print(a)
[0 1 2 3 4 5 6 7 8 9]
>>> b = slice(2, 8, 2)    # 从索引 2 开始到索引 8 停止,步长为 2
>>> print(a[b])
[2 4 6]

通过冒号分隔切片参数 [start:stop:step] 来进行切片:

>>> import numpy as np
>>> a = np.arange(12)
>>> print(a)
[ 0  1  2  3  4  5  6  7  8  9 10 11]
>>> print(a[1:9:2])        # 从索引 1 开始到索引 9 停止,步长为 2
[1 3 5 7]
>>> print(a[5:])
[ 5  6  7  8  9 10 11]     # 从索引 5 开始一直到最后一个元素

二数组中的切片,格式类似于 a[start:stop:step, start:stop:step],以逗号来分割行与列。

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8 ,9], [10, 11, 12], [13, 14, 15], [16, 17, 18]])
>>> print(a)
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12][13 14 15][16 17 18]]
>>> print(a[0:4:2])       # 按照行从索引 0 开始到索引 4 停止,步长为 2
[[1 2 3][7 8 9]]
>>> print(a[0:4:2,...])   # 与上述方法相同,... 与 : 作用相同
[[1 2 3][7 8 9]]
>>> print(a[...,1:])      # 按照列从索引 1 开始一直到最后一个元素
[[ 2  3][ 5  6][ 8  9][11 12][14 15][17 18]]
>>> print(a[1:5:2,1:])   # 分别按照行从索引 1 开始到索引 5 停止,步长为 2,按照列从索引 1 开始一直到最后一个元素
[[ 5  6][11 12]]

三数组中的切片,格式类似于 a[start:stop:step, start:stop:step, start:stop:step],以逗号来分割块、行与列。

>>> import numpy as np
>>> a = np.array([[[1,2,3,4], [5,6,7,8]], [[9,10,11,12], [13,14,15,16]], [[17,18,19,20], [21,22,23,24]]])
>>> print(a)
[[[ 1  2  3  4][ 5  6  7  8]][[ 9 10 11 12][13 14 15 16]][[17 18 19 20][21 22 23 24]]]
>>> print(a[1,:,0:2])   # 取索引为 1 的块数、所有行、索引为 0 到 2 的列
[[ 9 10][13 14]]
>>> print(a[1,:,:])     # 取索引为 1 的块数、所有行与列
[[ 9 10 11 12][13 14 15 16]]
>>> print(a[1,...,:])   # ... 与 : 作用相同
[[ 9 10 11 12][13 14 15 16]]

【4x00】NumPy 数组运算以及广播原则

NumPy 数组与数之间、数组与数组之间都支持加减乘除的计算。

  • 对于数组与数之间的计算,由于 NumPy 的广播机制,加减乘除都会对数组的每一个元素进行操作。

  • 对于数组与数组之间的计算,相同维度的,相同位置元素之间会进行计算,不同维度的,将自动触发广播机制。

广播(Broadcast)原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为 1,则认为它们是广播兼容的。广播会在缺失和(或)长度为 1 的维度上进行。

通俗理解,以下情况的两个数组均可进行广播:

1、两个数组各维度大小从后往前比对均一致:

>>> import numpy as np
>>> a = np.ones((3, 4, 5))
>>> b = np.ones((4, 5))
>>> print((a+b).shape)
(3, 4, 5)
>>>
>>> 
>>> c = np.ones((3))
>>> d = np.ones((2, 3))
>>> print((c+d).shape)
(2, 3)
>>>
>>> 
>>> e = np.ones((3, 4, 5))
>>> f = np.ones((4, 2))
>>> print((e+f).shape)
Traceback (most recent call last):File "<pyshell#16>", line 1, in <module>print((e+f).shape)
ValueError: operands could not be broadcast together with shapes (3,4,5) (4,2) 
# 因为 e 和 f 维度大小此前往后对比不一致,所以会抛出异常

2、两个数组存在一些维度大小不相等时,在其中一个数组中,这个不相等的维度大小为 1:

>>> import numpy as np
>>> a = np.ones((3, 4, 5))
>>> b = np.ones((4, 1))
>>> print((a+b).shape)
(3, 4, 5)
# 此时虽然 a 与 b 的维度大小此前往后对比不一致,但是 b 数组的这个维度大小为 1,所以仍然可以相加

那么当两个数组之间可以进行广播的时候,具体是怎样广播、怎样计算的呢?以下通过代码和图解来更进一步理解广播机制:

数组与数之间的运算:

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4, 5])
>>> print(a)
[1 2 3 4 5]
>>> print(a+1)     # 对数组每一个元素都 +1
[2 3 4 5 6]
>>> print(a-1)     # 对数组每一个元素都 -1
[0 1 2 3 4]
>>> print(a*2)     # 对数组每一个元素都 *1
[ 2  4  6  8 10]
>>> print(a/2)     # 对数组每一个元素都 /1
[0.5 1.  1.5 2.  2.5]

相同维度的数组与数组之间的运算:

>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> b = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20]])
>>> print(a)
[[ 1  2  3  4  5][ 6  7  8  9 10]]
>>> print(b)
[[11 12 13 14 15][16 17 18 19 20]]
>>> print(a+b)
[[12 14 16 18 20][22 24 26 28 30]]
>>> print(b-a)
[[10 10 10 10 10][10 10 10 10 10]]
>>> print(a*b)
[[ 11  24  39  56  75][ 96 119 144 171 200]]
>>> print(b/a)
[[11.          6.          4.33333333  3.5         3.        ][ 2.66666667  2.42857143  2.25        2.11111111  2.        ]]

不同维度的数组与数组之间的运算:

实例一:一个二维数组与一个一维数组相加,此时就会触发广播机制,代码与图解如下:

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
>>> b = np.array([20, 20, 20])
>>> print(a)
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12]]
>>> print(b)
[20 20 20]
>>> print(a+b)
[[21 22 23][24 25 26][27 28 29][30 31 32]]

01

实例二:一个 4 行 3 列的二维数组与一个 4 行 1 列的二维数组相加,此时就会触发广播机制,代码与图解如下:

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
>>> b = np.array([[1], [2], [3], [4]])
>>> print(a)
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12]]
>>> print(b)
[[1][2][3][4]]
>>> print(a+b)
[[ 2  3  4][ 6  7  8][10 11 12][14 15 16]]

02

实例三:一个 3 块 4 行 2 列,即 shape=(3, 4, 2) 的三维数组与一个 1 块 4 行 2 列,即 shape=(1, 4, 2) 的三维数组相加,此时就会触发广播机制,代码与图解如下:

>>> import numpy as np
>>> a = np.array([[[1, 2], [3, 4], [5, 6], [7, 8]], [[9, 10], [11, 12], [13, 14], [15, 16]], [[17, 18], [19, 20], [21, 22], [23, 24]]])
>>> b = np.array([[[1, 2], [3, 4], [5, 6], [7, 8]]])
>>> print(a)
[[[ 1  2][ 3  4][ 5  6][ 7  8]][[ 9 10][11 12][13 14][15 16]][[17 18][19 20][21 22][23 24]]]
>>> print(b)
[[[1 2][3 4][5 6][7 8]]]
>>> print(a.shape)
(3, 4, 2)
>>> print(b.shape)
(1, 4, 2)
>>> print(a+b)
[[[ 2  4][ 6  8][10 12][14 16]][[10 12][14 16][18 20][22 24]][[18 20][22 24][26 28][30 32]]]

03


这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/104988137
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!

【5x00】数组的拼接与元素的添加

【5x01】将数组转换成列表,拼接完成再转换成数组

数组的拼接,可以先将数组转成列表,利用列表的拼接函数,如:append()、extend() 等进行拼接处理,然后再将列表转成数组即可。

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])
>>> a_list = list(a)
>>> b_list = list(b)
>>> for i in b_list:a_list.append(i)>>> a_list
[1, 2, 3, 4, 5, 6]
>>> a = np.array(a_list)
>>> a
array([1, 2, 3, 4, 5, 6])

【5x02】numpy.append()

numpy.append() 方法可以将一个数组附加到另一个数组的尾部,与 Python 列表中的 append 方法类似,仅支持两个数组之间的拼接,不能一次性拼接多个数组。

基本语法:numpy.append(a, values, axis=None)

参数解释:

参数描述
a被添加元素的目标数组
values要添加元素的目标数组,即将该数组添加到 a 数组的尾部
如果指定了 axis 的值,则要求该数组的维度必须与 a 相同
axis指定轴,按照指定轴的方向进行拼接
如果未指定轴,则在使用前会将 a 和 values 都展平

应用举例:

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])
>>> print(np.append(a, b))                 # 两个一维数组进行拼接
[1 2 3 4 5 6]
>>> 
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> b = np.array([10, 11, 12])
>>> print(np.append(a, b))                 # 一维数组与二维数组进行拼接
[ 1  2  3  4  5  6  7  8  9 10 11 12]
>>> 
>>> a = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
>>> b = np.array([[13, 14, 15], [16, 17, 18]])
>>> print(np.append(a, b))                # 二维数组与三维数组进行拼接
[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18]
>>> print(type(np.append(a, b)))          # 拼接后的数组仍然是一个 ndarray 对象
<class 'numpy.ndarray'>

指定 axis 的值举例(指定了 axis 的值,要求两个数组的维度必须相同):

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> b = np.array([[7, 8, 9]])
>>> print(np.append(a, b, axis=0))       # a、b 均为二维数组,指定 axis 值为 0
[[1 2 3][4 5 6][7 8 9]]
>>>
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> b = np.array([7, 8, 9])
>>> print(np.append(a, b, axis=0))      # a 为二维数组,b 为一维数组,指定 axis 值为 0,此时会报错
Traceback (most recent call last):......
ValueError: all the input arrays must have same number of dimensions, ...

【5x03】numpy.concatenate()

numpy.concatenate() 方法能够一次完成多个相同形状数组的拼接。该方法效率更高,适合大规模的数据拼接。

基本语法:numpy.concatenate((a1, a2, ...), axis=0)

参数解释:

参数描述
a1, a2, …要拼接的多个数组,要求各数组形状相同
axis指定轴,按照指定轴的方向进行拼接,默认为 0 轴

要求各数组形状相同举例:如果 axis=0,则要求 1 轴(竖轴)相同,如果 axis=1,则要求 0 轴(横轴)相同。

应用举例:

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> b = np.array([[10, 11, 12], [13, 14, 15]])
>>> c = np.array([[16, 17, 18]])        # 三个二维数组的 1 轴(竖轴)相同
>>> print(np.concatenate((a, b, c)))    # 三个二维数组默认沿 0 轴(横轴)进行拼接
[[ 1  2  3][ 4  5  6][ 7  8  9][10 11 12][13 14 15][16 17 18]]
>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> b = np.array([[9, 10, 11], [12, 13, 14]])
>>> c = np.array([[15, 16], [17, 18]])          # 三个二维数组的 0 轴(横轴)相同
>>> print(np.concatenate((a, b, c), axis=1))    # 三个二维数组沿 1 轴(竖轴)进行拼接
[[ 1  2  3  4  9 10 11 15 16][ 5  6  7  8 12 13 14 17 18]]
>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> b = np.array([[9, 10, 11], [12, 13, 14]])
>>> c = np.array([[15, 16], [17, 18]])          # 三个二维数组的 0 轴(横轴)相同
>>> print(np.concatenate((a, b, c), axis=0))    # 三个二维数组沿 0 轴(横轴)进行拼接将会报错
Traceback (most recent call last):......
ValueError: all the input array dimensions for the concatenation axis must match exactly, ...

【5x04】numpy.stack()

numpy.stack() 方法用于沿新轴连接数组序列。

基本语法:numpy.stack(arrays, axis=0)

参数解释:

参数描述
arrays相同形状的数组序列
axis返回数组中的轴,输入数组将沿着该轴来进行堆叠

应用举例:

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])
>>> print(np.stack((a, b),axis=0))
[[1 2 3][4 5 6]]
>>> print(np.stack((a, b),axis=1))
[[1 4][2 5][3 6]]
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6],[7,8]])
>>> print(np.stack((a,b),axis=0))
[[[1 2][3 4]][[5 6][7 8]]]
>>> print(np.stack((a,b),axis=1))
[[[1 2][5 6]][[3 4][7 8]]]

【5x05】numpy.vstack()

numpy.vstack() 方法通过垂直堆叠来生成数组。

基本语法:numpy.vstack(tup)

参数解释:tup:数组序列,如果是一维数组进行堆叠,则数组长度必须相同,其它数组除了第一个轴(axis=0)的长度可以不同外,其它轴的长度必须相同。

应用举例:

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])
>>> print(np.vstack((a,b)))
[[1 2 3][4 5 6]]
>>> 
>>> b = np.array([4, 5])
>>> print(np.vstack((a,b)))       # 一维数组长度不一样时将抛出异常
Traceback (most recent call last):......
ValueError: all the input array dimensions for the concatenation axis must match exactly, ...
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6],[7,8]])
>>> a.shape
(2, 2)
>>> b.shape
(2, 2)
>>> print(np.vstack((a,b)))
[[1 2][3 4][5 6][7 8]]
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6],[7,8],[9,10]])
>>> a.shape
(2, 2)
>>> b.shape
(3, 2)
>>> print(np.vstack((a,b)))    # 第一个轴(axis=0)可以不同,其它轴必须相同
[[ 1  2][ 3  4][ 5  6][ 7  8][ 9 10]]

【5x06】numpy.hstack()

numpy.hstack() 方法通过水平堆叠来生成数组。

基本语法:numpy.hstack(tup)

参数解释:tup:数组序列,除了一维数组的堆叠可以是不同长度外,其它数组堆叠时,除了第二个轴(axis=1)的长度可以不同外,其它轴的长度必须相同。

应用举例:

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5])
>>> print(np.hstack((a,b)))
[1 2 3 4 5]
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6],[7,8]])
>>> a.shape
(2, 2)
>>> b.shape
(2, 2)
>>> print(np.hstack((a,b)))
[[1 2 5 6][3 4 7 8]]
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6,7],[8,9,10]])
>>> a.shape
(2, 2)
>>> b.shape
(2, 3)
>>> print(np.hstack((a,b)))       # 第二个轴(axis=1)可以不同,其它轴必须相同
[[ 1  2  5  6  7][ 3  4  8  9 10]]

【5x07】numpy.dstack()

numpy.dstack() 方法会沿着第三个维度拼接数组。

基本语法:numpy.dstack(tup)

参数解释:tup:数组序列,除了第三个轴(axis=2)的长度可以不同外,其它轴的长度必须相同。一维或二维数组必须具有相同的形状。

应用举例:

>>> import numpy as np
>>> a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
>>> b = np.array([[[9], [10]], [[11], [12]]])
>>> a.shape
(2, 2, 2)
>>> b.shape
(2, 2, 1)
>>> print(np.dstack((a,b)))     # a 与 b 的第三个轴(axis=2)一个是 2,另一个是 1,可以不同,但其他轴必须相同
[[[ 1  2  9][ 3  4 10]][[ 5  6 11][ 7  8 12]]]
>>> import numpy as np
>>> a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
>>> b = np.array([[[9, 10], [11, 12]]])
>>> a.shape
(2, 2, 2)
>>> b.shape
(1, 2, 2)
>>> print(np.dstack((a,b)))    # a 与 b 的第一个轴(axis=0)不同,将会抛出异常
[[[ 1  2  9][ 3  4 10]][[ 5  6 11][ 7  8 12]]]
>>> print(np.dstack((a,b)))
Traceback (most recent call last):......
ValueError: all the input array dimensions for the concatenation axis must match exactly, ...

【5x08】以上几种方法的区别

  • concatenate() 方法在 axis=0 的时候相当于 vstack() 方法;
  • concatenate() 方法在 axis=1 的时候相当于 hstack() 方法;
  • concatenate() 方法在 axis=2 的时候相当于 dstack() 方法;
  • concatenate() 方法不会生成一个新的维度,且数组的维度不一定相同,而 stack() 方法生成一个新的维度,并且要求所有数组形状都要一样。

concatenate() 方法与 stack() 方法比较:

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])
>>> c = np.stack((a, b), axis=0)
>>> d = np.concatenate((a, b), axis=0)
>>> a.shape
(3,)
>>> b.shape
(3,)
>>> c.shape
(2, 3)
>>> d.shape
(6,)
>>> print(c)
[[1 2 3][4 5 6]]
>>> print(d)
[1 2 3 4 5 6]

【5x09】numpy.insert()

numpy.insert() 方法沿指定轴在指定索引之前插入值。

基本语法:numpy.insert(arr, obj, values, axis=None)

参数解释:

参数描述
arr原数组
obj索引值,将在其之前插入值
values要插入的值
axis轴,将沿着该轴进行插入操作,如果未指定,则插入前,原数组会被展开,变为一维数组

应用举例:

>>> import numpy as np
>>> a = np.array([[1,2],[3,4],[5,6]])
>>> print(np.insert(a, 3, [0, 0]))          # 未指定 axis 参数,在插入之前原数组会被展开
[1 2 3 0 0 4 5 6]
>>> print(np.insert(a, 1, [0], axis = 0))   # 沿 0 轴广播插入
[[1 2][0 0][3 4][5 6]]
>>> print(np.insert(a, 1, 11, axis = 1))    # 沿 1 轴广播插入
[[ 1 11  2][ 3 11  4][ 5 11  6]]

【5x10】numpy.r_

numpy.r_:rrow(行) 的缩写,即按照行连接两个矩阵,要求列数相等。

应用举例:

>>> import numpy as np
>>> a = np.array([[1, 2, 3],[7, 8, 9]])
>>> b = np.array([[4, 5, 6],[1, 2, 3]])
>>> 
>>> np.r_[a, b]
array([[1, 2, 3],[7, 8, 9],[4, 5, 6],[1, 2, 3]])

【5x11】numpy.c_

numpy.c_:ccolumn(列) 的缩写,即按照列连接两个矩阵,要求行数相等。

应用举例:

>>> import numpy as np
>>> a = np.array([[1, 2, 3],[7, 8, 9]])
>>> b = np.array([[4, 5, 6],[1, 2, 3]])
>>> 
>>> np.c_[a, b]
array([[1, 2, 3, 4, 5, 6],[7, 8, 9, 1, 2, 3]])

【6x00】数组的分割与元素的删除

【6x01】numpy.split()

numpy.split() 方法可以沿特定的轴将数组均等的分割为子数组。如果不能等分,将抛出异常。

基本语法:numpy.split(ary, indices_or_sections, axis=0)

参数解释:

参数描述
ary被分割的数组
indices_or_sections如果是一个整数 N,则该数组将沿 axis 均分为 N 个数组
如果是一维整数数组,则数组元素代表每个分割点位置(左闭右开),N 个分裂点会得到 N + 1 个子数组
axis沿着哪个维度进行分割,默认为 0,横向分割;为 1 时,纵向分割

应用举例:

>>> import numpy as np
>>> a = np.arange(10)
>>> print(a)
[0 1 2 3 4 5 6 7 8 9]
>>> print(np.split(a, 5))              # 将数组分为五个大小相等的子数组
[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]
>>>
>>> print(np.split(a, 4))              # 无法等分的情况下将抛出异常
Traceback (most recent call last):......
ValueError: array split does not result in an equal division
>>>
>>> print(np.split(a, [4, 8]))        # 分割点为索引 4 和 8 的位置,相当于 a[:4]、a[4:8]、a[8:]
[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([8, 9])]
>>>
>>> a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> print(np.split(a, 5, axis=1))     # 指定 axis=1,按照纵向分割数组
[array([[1], [6]]),array([[2], [7]]),array([[3], [8]]),array([[4], [9]]),array([[ 5], [10]])]

【6x02】numpy.array_split()

numpy.array_split() 的用法和作用都与 split() 方法一致,都可以用一个整数或者整数列表来分割数组。

两者的区别:如果输入的是一个 int 类型的数字,那么在 split() 方法中,数组必须是均等的分割,否则就会报错,而在 array_split() 方法中是可以进行不均等的分割的。

基本语法:numpy.array_split(ary, indices_or_sections, axis=0)

参数解释:

参数描述
ary被分割的数组
indices_or_sections如果是一个整数 N,则该数组将沿 axis 分割为 N 个数组,可以不是均分的
如果是一维整数数组,则数组元素代表每个分割点位置(左闭右开),N 个分裂点会得到 N + 1 个子数组
axis沿着哪个维度进行分割,默认为 0,横向分割;为 1 时,纵向分割

应用举例:

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6, 7])
>>> print(np.array_split(a, 3))
[array([1, 2, 3]), array([4, 5]), array([6, 7])]   # 可以是不均分的
>>>
>>> print(np.array_split(a, 4))
[array([1, 2]), array([3, 4]), array([5, 6]), array([7])]

【6x03】numpy.vsplit()

numpy.vsplit() 方法相当于 split() 方法在 axis=0 时的效果,即横向分割数组。

基本语法:numpy.vsplit(ary, indices_or_sections)

参数解释:

参数描述
ary被分割的数组
indices_or_sections如果是一个整数 N,则该数组将沿 axis 分为 N 个相等的数组
如果是一维整数数组,则数组元素代表每个分割点位置(左闭右开),N 个分裂点会得到 N + 1 个子数组

应用举例:

>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
>>> print(np.vsplit(a, 2))
[array([[1, 2, 3], [4, 5, 6]]),array([[ 7,  8,  9], [10, 11, 12]])]
>>>
>>> print(np.vsplit(a, [1, 3]))
[array([[1, 2, 3]]),array([[4, 5, 6], [7, 8, 9]]),array([[10, 11, 12]])]

【6x04】numpy.hsplit()

numpy.hsplit() 方法相当于 split() 方法在 axis=1 时的效果,即纵向分割数组。

基本语法:numpy.hsplit(ary, indices_or_sections)

参数解释:

参数描述
ary被分割的数组
indices_or_sections如果是一个整数 N,则该数组将沿 axis 分为 N 个相等的数组
如果是一维整数数组,则数组元素代表每个分割点位置(左闭右开),N 个分裂点会得到 N + 1 个子数组

应用举例:

>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> print(np.hsplit(a, 5))
[array([[1], [6]]), array([[2], [7]]),array([[3], [8]]),array([[4], [9]]),array([[ 5], [10]])]
>>>
>>> print(np.hsplit(a, [1, 3]))
[array([[1], [6]]),array([[2, 3], [7, 8]]),array([[ 4,  5], [ 9, 10]])]

【6x05】numpy.dsplit()

numpy.dsplit() 方法相当于 split() 方法在 axis=2 时的效果,即沿第三轴将数组拆分为多个子数组。

基本语法:numpy.dsplit(ary, indices_or_sections)

参数解释:

参数描述
ary被分割的数组
indices_or_sections如果是一个整数 N,则该数组将沿 axis 分为 N 个相等的数组
如果是一维整数数组,则数组元素代表每个分割点位置(左闭右开),N 个分裂点会得到 N + 1 个子数组

应用举例:

>>> import numpy as np
>>> a = np.arange(16).reshape(2, 2, 4)
>>> print(a)
[[[ 0  1  2  3][ 4  5  6  7]][[ 8  9 10 11][12 13 14 15]]]
>>> print(np.dsplit(a, 2))
[array([[[ 0,  1], [ 4,  5]], [[ 8,  9], [12, 13]]]), array([[[ 2,  3], [ 6,  7]], [[10, 11], [14, 15]]])]
>>>
>>> print(np.dsplit(a, [3, 6]))
[array([[[ 0,  1,  2], [ 4,  5,  6]], [[ 8,  9, 10], [12, 13, 14]]]),array([[[ 3], [ 7]], [[11], [15]]]), array([], shape=(2, 2, 0), dtype=int32)]

【6x06】numpy.delete()

numpy.delete() 方法返回一个从原数组中删除了指定子数组的新数组。

基本语法:numpy.delete(arr,obj,axis=None)

参数解释:

参数描述
arr原数组
obj可以是切片、整数或整数数组形式,表示沿指定轴删除的子数组的索引
当 obj 为切片形式时,要用 np.s_[:] 的格式
axis轴,将沿着该轴进行插入操作,如果未指定,则插入前,原数组会被展开,变为一维数组

应用举例:

>>> import numpy as np
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> print(np.delete(a, 8))          # 未指定 axis 参数,在插入之前原数组会被展开,然后再删除索引为 8 的元素
[ 1  2  3  4  5  6  7  8 10 11 12]
>>>
>>> print(np.delete(a, 1, axis=0))  # 指定 axis=0,删除索引值为 1 即第二行
[[ 1  2  3  4][ 9 10 11 12]]
>>>
>>> print(np.delete(a, 1, axis=1))  # 指定 axis=1,删除索引值为 1 即第二列
[[ 1  3  4][ 5  7  8][ 9 11 12]]
>>>
>>> print(np.delete(a, np.s_[:2], axis=1)) # 切片形式,删除前两列
[[ 3  4][ 7  8][11 12]]
>>>
>>> print(np.delete(a, [0, 2], axis=1))    # 数组形式,删除索引值为 0 和 2 的列
[[ 2  4][ 6  8][10 12]]

【6x07】numpy.unique()

numpy.unique() 方法用于去除数组中的重复元素。

基本语法:numpy.unique(arr, return_index=False, return_inverse=False, return_counts=False, axis=None)

参数解释:

参数描述
arr原数组,如果不是一维数组则会被展开为一维数组
return_index如果为 true,则返回新列表元素在旧列表中的位置(下标),并以列表形式储
return_inverse如果为 true,则返回旧列表元素在新列表中的位置(下标),并以列表形式储
return_counts如果为 true,则返回去重数组中的元素在原数组中的出现次数
axis指定轴

应用举例:

未指定 axis 值,原数组将会被展开:

>>> import numpy as np
>>> a = np.array([1, 1, 2, 2, 3, 4, 5, 5])
>>> b = np.array([[1, 1], [2, 3], [3, 4]])
>>> print(np.unique(a))
[1 2 3 4 5]
>>> print(np.unique(b))
[1 2 3 4]

指定 axis 值:

>>> import numpy as np
>>> a = np.array([[1, 0, 1], [1, 0, 1], [2, 3, 2], [5, 6, 5]])
>>> print(a)
[[1 0 1][1 0 1][2 3 2][5 6 5]]
>>> print(np.unique(a, axis=0))    # 删除相同的行
[[1 0 1][2 3 2][5 6 5]]
>>> print(np.unique(a, axis=1))    # 删除相同的列
[[0 1][0 1][3 2][6 5]]

return_counts 为 True 时,返回去重数组中的元素在原数组中的出现次数:

>>> import numpy as np
>>> a = np.array([1, 1, 1, 2, 2, 3, 4, 5, 5])
>>> print(np.unique(a, return_counts=True))
(array([1, 2, 3, 4, 5]), array([3, 2, 1, 1, 2], dtype=int64))
# 前一个 array 表示去重后的数组,后一个 array 表示每一个元素在原数组中出现的次数

这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/104988137
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】Asp.net的生命周期应用之IHttpModule和IHttpHandler

引言 Http 请求处理流程 和 Http Handler 介绍 这两篇文章里&#xff0c;我们首先了解了Http请求在服务器端的处理流程&#xff0c;随后我们知道Http请求最终会由实现了IHttpHandler接口的类进行处理(应该记得Page类实现了IHttpHandler)。从 Http 请求处理流程 一文的最后的一…

Python 数据分析三剑客之 NumPy(三):数组的迭代与位运算

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】ASP.NET内幕 - IIS处理模型

介绍 微软的Active ServerPages&#xff0c;即ASP&#xff0c;自1996年首次发布以来&#xff0c;为Web开发者构建Web应用提供了一个丰富、复杂的框架。过去的几年它的基础架构发展的如此迅速&#xff0c;成为目前大家了解的ASP.NET&#xff0c;已经不再象它的前身。ASP.NET是构…

沉淀一年零八个月,我也拿到了博客专家

回忆 第一篇文章的发布是在 2018.08.30&#xff0c;虽然注册 CSDN 已有三年多了&#xff0c;但一直都是白嫖大佬们的文章&#xff0c;没有自己写东西&#xff0c;回想起刚开始写博客&#xff0c;最开始并不是在 CSDN 的&#xff0c;在我大二上学期的时候&#xff0c;网上冲浪发…

JAVA-入门(内含jdk配置)

title: java入门 date: 2019-07-21 19:50:19 tags: java学习 top: 1 JAVASE学习 1.java入门 More info: Writing //超链接 2.java开发环境配置 第一步是配置本地开发环境&#xff0c;学习最基本的桌面开发&#xff0c;下面以win10为例配置Java开发环境&#xff0c;即&#…

【转】EF三种编程方式的区别Database first ,Model first ,code first

首先对于EF中先出现的datebase first和model first两种编程方式&#xff0c;其的区别根据字面意思很容易能够理解。 datebase first就是代表数据库优先&#xff0c;那么前提就是先创建数据库。 model first就是代表model优先&#xff0c;那么前提也就是先创建model&#xf…

【转】学习Entity Framework 中的Code First

这是上周就写好的文章&#xff0c;是在公司浩哥的建议下写的&#xff0c;本来是部门里面分享求创新用的&#xff0c;这里贴出来分享给大家。 最近在对MVC的学习过程中&#xff0c;接触到了Code First这种新的设计模式&#xff0c;感觉很新颖&#xff0c;并且也体验到了这种方式…

HDFS--分布式文件系统

HDFS–分布式文件系统 1.Hadoop生态系统简介 2.HDFS基本架构 3.HDFS的核心原理 4.shell命令行操作 5.JAVAAPI的操作 6.HDFS集群运维与调优经验

Hbase搭建-基于hadoop3--并且解决了hbase error: KeeperErrorCode = NoNode for /hbase/master错误

Hbase搭建-基于hadoop3 habse搭建在下面。。上面写有一些我遇到的很烦躁的错误&#xff0c;捣鼓了两天&#xff01;&#xff01;&#xff01; **别用hadoop3** 经过几天的奋战&#xff0c;开始用的hadoop3.2.0&#xff0c;hbase-2.2.0&#xff0c; Hmaster启动后几秒后被杀…

Python 数据分析三剑客之 Matplotlib(一):初识 Matplotlib 与其 matplotibrc 配置文件

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

hadoop分布式集群搭建,包含网络配置-hadoop3环境

先准备三台或者五台虚拟机&#xff08;我这里写三台&#xff0c;实际我用的五台&#xff09; 在安装centos时可以在选择&#xff08;最小安装还是图形化界面处&#xff09;有配置网络的&#xff0c;把网络先配置好&#xff0c;这样就不需要在重新配置了 先配置一台主机&#…

Python 数据分析三剑客之 Matplotlib(二):文本描述 / 中文支持 / 画布 / 网格等基本图像属性

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】C++/CLI入门系列 第二篇:封装C++ dll库,提供接口给C#调用

看了第一篇感觉没啥用对吧&#xff0c;来点稍微有用的。 1、先建个c#工程&#xff0c;依次 file -> new -> project&#xff0c;选择 visula c# -> console application&#xff0c;写工程名&#xff0c;点 ok。 2、再建个c dll工程。依次 file -> add -> new …

Python 数据分析三剑客之 Matplotlib(三):图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

zookeeper完全分布搭建-安装-配置

我这里是用的五台机器。 官网下载解压zookeeper&#xff0c;这里用的3.4.6 解压到/usr/local下 修改配置文件 1- 首先进入到zookeeper-3.4.6下的conf文件夹下 cd /usr/local/zookeeper/zookeeper-3.4.6/confls查看文件&#xff0c;然后拷贝zoo_sample.cfg并重命名为zoo.cf…

Python 数据分析三剑客之 Matplotlib(四):线性图的绘制

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

Hbase error: KeeperErrorCode = NoNode for /hbase/master错误

Hbase运行hbase shell输入status与list测试会报错error: KeeperErrorCode NoNode for /hbase/master 经过两天的不挺找错&#xff0c;更改&#xff0c;解决&#xff0c;出现这个错误的原因是hadoop与Hbase版本不兼容所致。 别用hadoop3 经过几天的奋战&#xff0c;开始用的…

Python 数据分析三剑客之 Matplotlib(五):散点图的绘制

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

hadoop集群-格式化namenode节点后,从节点的datanode不能启动,或者是datanode启动到主节点上。

进行二次namenode格式化前&#xff0c;请注意&#xff1a; hadoop namenode -format进行着一步前&#xff0c;要把以前格式化的内容删掉&#xff0c;如果&#xff0c;你的路径是在hadoop文件夹内&#xff0c;那么直接格式化即可&#xff0c;如果是在外部创建的文件夹&#xff…