Python数据分析之NumPy(1)——NumPy快速入门笔记:用一篇文章快速解最核心的NumPy知识

零基础小白如何快速入门学习Python数据分析 Python人才需求大,据权威统计机构显示,2020年Python人才缺口高达80万。腾讯、阿里、百度、网易、谷歌、滴滴等大型互联网企业更是大量使用python开发。这一系列政策和市场迹象都表明,Python确是当下发展的新趋势。 Python开发的主要领域 网络爬虫:在爬虫领域,Python几乎是霸主地位,想爬啥就爬啥。 数据分析:实现数据可视化,直观的展示数据。 网站开发:借助django,flask框架自己搭建网站 人工智能:谁会成为AI和大数据时代的第一开发语言?Python!Python 阅读详情

大部分内容是来自英文版官方文档,再加上自己的一点理解,供自己复习用。

1. 几个重要概念

1.1 NumPy array (NumPy数组)

NumPy’s main object is the homogeneous multidimensional array. It
is a table of elements (usually numbers), all of the same type,
indexed by a tuple of non-negative integers.

注意一点:array中的元素是相同的类型
(以下基本用“数组”代替“NumPy数组”)

1.2 one axis/ axes(轴)

In NumPy dimensions are called axes.

在NumPy中,维度被称为轴。
很重要的概念。
在这里插入图片描述
在下面这个例子中,数组有两轴:
第一个轴的长度是2,第二个轴的长度是1。

[[ 1., 0., 0.],
 [ 0., 1., 2.]]

axis=0 即行变化的方向;axis=1 即列变化的方向。

记住轴的这些概念,后面会说到数组的合并,会再次用到它们。

1.3 element(元素)

number of element = length of a axis
一个轴元素的个数即是这个轴的长度。

1.4 ndarray

NumPy’s array class is called ndarray.
NumPy中的数组类被称作ndarray。

注意:numpy.array ≠ array.array (只有一维)
ndarray 重要的属性如下:

  • ndarray.ndim
    轴的数量或数组的维度数量

  • ndarray.shape
    数组的(形状)大小,也就是:用元组来表示每个维度上元素的数量

  • ndarray.size
    数组所含的元素总数(所有轴)

  • ndarray.dtype
    描述数组中元素类型的对象

    除了可以使用python类型来定义数组元素的类型,NumPy还提供了它自己的:
    numpy.int32,、numpy.int16、和numpy.float64

  • ndarray.itemsize
    所含元素的字节大小
    例如, float64 的 itemsize 是 8 (=64/8), 而 complex32 的 itemsize 是4 (=32/8)。实际上,相当于是 ndarray.dtype.itemsize.

一个例子:

>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<type 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
<type 'numpy.ndarray'>

2. NumPy 的一些基本用法

2.1 创建NumPy数组

  1. 使用使用 numpy.array() 函数 + 简单的python 列表/元组 快速创建
>>> import numpy as np
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')

>>> c = np.array( [ [1,2], [3,4] ], dtype=complex ) # 也可以自定义元素数据类型
>>> c
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]])
  • zeros()、ones()、empty()
    由于有很大一部分是这样的情况:数组的元素是不知道的,但它的形状是知道的。所以NumPy提供了一些便利的函数:
>>> np.zeros( (3,4) )
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>> np.ones( (2,3,4), dtype=np.int16 )                # dtype can also be specified
array([[[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]],
       [[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]]], dtype=int16)
>>> np.empty( (2,3) )                                 # uninitialized, output may vary
array([[  3.73603959e-262,   6.02658058e-154,   6.55490914e-260],
       [  5.30498948e-313,   3.14673309e-307,   1.00000000e+000]])

注意:

np.ones(shape, dtype=None, order=‘C’),其中的 shape参数,是要带括号的!!
看下面的小例子:

print(np.ones(3))
[1. 1. 1.]

print(np.ones(3,3))
TypeError: data type not understood

print(np.ones((3,3)))
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

  1. arange() 和 linspace()
  • np.arange([start,] stop[, step,], dtype=None)
    创建一个固定区间(包括stop)的、数值序列的数组(类似python的 range 函数);
  • np.linspace(start, stop, num=50)
    生成固定区间(包括stop)的、包含固定个数元素的数组,默认个数为50。
>>> from numpy import pi
>>> np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
>>> x = np.linspace( 0, 2*pi, 100 )        # useful to evaluate function at lots of points
>>> f = np.sin(x)

2.2 打印数组

有几个点需要注意:

  • the last axis is printed from left to right,

  • the second-to-last is printed from top to bottom,

  • the rest are also printed from top to bottom, with each slice separated from the next by an empty line.

其实,只需这样理解即可:
一维数组打印出来是以行(row)为显示;
二维数组即是平面的矩阵(装着数组的列表);
三维数组即是装着矩阵的列表。

>>> a = np.arange(6)                         # 1d array
>>> print(a)
[0 1 2 3 4 5]
>>>
>>> b = np.arange(12).reshape(4,3)           # 2d array
>>> print(b)  
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
>>>
>>> c = np.arange(24).reshape(2,3,4)         # 3d array
>>> print(c)  
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]
 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

上面的a、b和c分别可以理解为:
一行(维)数组、4个一维数组和2个3x4的矩阵

reshape()返回一个更改了形状的数组,后面也会讲到。

>>> print(np.arange(10000))
[   0    1    2 ..., 9997 9998 9999]
>>>
>>> print(np.arange(10000).reshape(100,100))
[[   0    1    2 ...,   97   98   99]
 [ 100  101  102 ...,  197  198  199]
 [ 200  201  202 ...,  297  298  299]
 ...,
 [9700 9701 9702 ..., 9797 9798 9799]
 [9800 9801 9802 ..., 9897 9898 9899]
 [9900 9901 9902 ..., 9997 9998 9999]]

一个小知识点:
想要显示完整的结果可以使用打印中的可选项:set_printoptions。

>>> np.set_printoptions(threshold=sys.maxsize)       # sys module should be imported

2.3 基本操作

Arithmetic operators on arrays apply elementwise. A new array is created and filled with the result.
需要记住的一点是:NumPy数组是

  1. 四则运算 + - * /
    注意:使用条件是形状相同的两个矩阵:
>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )
>>> A * B                       # elementwise product

如果是一个矩阵和一个一维的向量,这种情况,NumPy会使用它的广播机制,如下图:
在这里插入图片描述数组的数乘同样这样理解:
在这里插入图片描述

  1. 点乘
    数组点乘有两种表示,可以用 dot()函数或者方法,也可以使用 @ (python>=3.5)
>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )
>>> A * B                       # elementwise product
array([[2, 0],
       [0, 4]])
>>> A @ B                       # matrix product
array([[5, 4],
       [3, 4]])
>>> A.dot(B)                    # another matrix product
array([[5, 4],
       [3, 4]])

注意:

  • * 是 elementwise,跟dot()函数和@不同: A*B ≠ A.dot(B) or A @ B
  • 一些操作,比如 += 和 *= 是在原数组上进行修改而不是创建一个新的数组。
>>> a = np.ones((2,3), dtype=int)
>>> b = np.random.random((2,3))
>>> a *= 3
>>> a
array([[3, 3, 3],
       [3, 3, 3]])
>>> b += a
>>> b
array([[ 3.417022  ,  3.72032449,  3.00011437],
       [ 3.30233257,  3.14675589,  3.09233859]])
>>> a += b                  # b is not automatically converted to integer type
Traceback (most recent call last):
  ...
TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

当不同元数类型的数组进行运算时,其结果会“选择”更广的或者更精确的那种(类型)——被称作upcasting。

>>> a = np.ones(3, dtype=np.int32)
>>> b = np.linspace(0,pi,3)
>>> b.dtype.name
'float64'
>>> c = a+b
>>> c
array([ 1.        ,  2.57079633,  4.14159265])
>>> c.dtype.name
'float64'
>>> d = np.exp(c*1j)`在这里插入代码片`
>>> d
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
       -0.54030231-0.84147098j])
>>> d.dtype.name
'complex128'
  1. 一元操作:sum()、min()、max()

这些操作是ndarray 类中的方法。

>>> a = np.random.random((2,3))
>>> a
array([[ 0.18626021,  0.34556073,  0.39676747],
       [ 0.53881673,  0.41919451,  0.6852195 ]])
>>> a.sum()
2.5718191614547998
>>> a.min()
0.1862602113776709
>>> a.max()
0.6852195003967595

除此之外,在其它形状的数组中,可以指定需要计算的那个轴的,对上面的数组进行操作:

>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> b.sum(axis=0)                            # sum of each column
array([12, 15, 18, 21])
>>>
>>> b.min(axis=1)                            # min of each row
array([0, 4, 8])
>>>
>>> b.cumsum(axis=1)                         # cumulative sum along each row
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]])

2.4 通用函数

一些常见的数学函数,例如sin、cos和exp,还有sqrt、add等,在NumPy中被称为“universal functions”(ufunc).这些函数,依旧是按照数组的元素来进行操作,并产生一个数组作为结果。

>>> B = np.arange(3)
>>> B
array([0, 1, 2])
>>> np.exp(B)
array([ 1.        ,  2.71828183,  7.3890561 ])
>>> np.sqrt(B)
array([ 0.        ,  1.        ,  1.41421356])
>>> C = np.array([2., -1., 4.])
>>> np.add(B, C)
array([ 2.,  0.,  6.])

2.5 索引、切片和迭代

  1. 一维数组

类似列表以及其他python序列:

>>> a = np.arange(10)**3
>>> a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
>>> a[2]
8
>>> a[2:5]
array([ 8, 27, 64])
>>> a[:6:2] = -1000    # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000
>>> a
array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   729])
>>> a[ : :-1]                                 # reversed a
array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1, -1000])
>>> for i in a:
...     print(i**(1/3.))
...
nan
1.0
nan
3.0
nan
5.0
6.0
7.0
8.0
9.0

注意:
a[:6:2] = -1000 相当于 a[0:6:2] = -1000
每隔两个元素,将索引从0到6 位置的元素的值设置为指定的-1000

  1. 多维数组
    多维数组每一个轴对应一个索引,它们之间用元组表示,用逗号隔开。
>>> def f(x,y):
...     return 10*x+y
...
>>> b = np.fromfunction(f,(5,4),dtype=int)
>>> b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
>>> b[2,3]
23
>>> b[0:5, 1]                       # each row in the second column of b
array([ 1, 11, 21, 31, 41])
>>> b[ : ,1]                        # equivalent to the previous example
array([ 1, 11, 21, 31, 41])
>>> b[1:3, : ]                      # each column in the second and third row of b
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])

如果索引的数量于数组轴的数量,则缺失的位置,用:来代替,即表示全部的切片。

>>> b[-1]                                  # the last row. Equivalent to b[-1,:]
array([40, 41, 42, 43])

3. 操纵数组的形状

  1. 改变数组的形状大小
    np.ravel()
    np.reshape()
    np.T
    np. reseize()
>>> a = np.floor(10*np.random.random((3,4)))
>>> a
array([[ 2.,  8.,  0.,  6.],
       [ 4.,  5.,  1.,  1.],
       [ 8.,  9.,  3.,  6.]])
>>> a.shape
(3, 4)

>>> a.ravel()  # returns the array, flattened
array([ 2.,  8.,  0.,  6.,  4.,  5.,  1.,  1.,  8.,  9.,  3.,  6.])
>>> a.reshape(6,2)  # returns the array with a modified shape
array([[ 2.,  8.],
       [ 0.,  6.],
       [ 4.,  5.],
       [ 1.,  1.],
       [ 8.,  9.],
       [ 3.,  6.]])
>>> a.T  # returns the array, transposed
array([[ 2.,  4.,  8.],
       [ 8.,  5.,  9.],
       [ 0.,  1.,  3.],
       [ 6.,  1.,  6.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)

注意点:
①reshape()中的参数-1,表示该轴的大小自动计算(不需要我们自己给出)
②resize和reshape的区别
reshape()不改变原数组,是返回一个新的数组;
resize()是直接修改原数组

>>> a
array([[ 2.,  8.,  0.,  6.],
       [ 4.,  5.,  1.,  1.],
       [ 8.,  9.,  3.,  6.]])
>>> a.resize((2,6))
>>> a
array([[ 2.,  8.,  0.,  6.,  4.,  5.],
       [ 1.,  1.,  8.,  9.,  3.,  6.]])
>>> a.reshape(3,-1)
array([[ 2.,  8.,  0.,  6.],
       [ 4.,  5.,  1.,  1.],
       [ 8.,  9.,  3.,  6.]])

③上面四个命令,只有resize了改变了原来的数组,其它都只是返回一个被修改了的数组。

  1. 数组合并

通过沿着不同的轴向,数组有着不同的合并方式:vstack()代表vertical stack,沿着竖直的方向进行合并;hstack()即horizontal stack,沿着水平方向进行合并。

>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[ 8.,  8.],
       [ 0.,  0.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[ 1.,  8.],
       [ 0.,  4.]])
>>> np.vstack((a,b))
array([[ 8.,  8.],
       [ 0.,  0.],
       [ 1.,  8.],
       [ 0.,  4.]])
>>> np.hstack((a,b))
array([[ 8.,  8.,  1.,  8.],
       [ 0.,  0.,  0.,  4.]])

稍微想一想,什么叫沿着轴的方向?其实,这样理解就可以:
np.vstack()代表沿着行变化的方向进行;np.hstack()代表沿着列变化的方向进行

最常见的合并操作是:np.concatenate()、np.vstack()、np.hstack()
  • np.vstack()
    Stack arrays in sequence vertically (row wise).
>>> a = np.array([1, 2, 3])
>>> b = np.array([2, 3, 4])
>>> np.vstack((a,b))
array([[1, 2, 3],
       [2, 3, 4]])
>>> a = np.array([[1], [2], [3]])
>>> b = np.array([[2], [3], [4]])
>>> np.vstack((a,b))
array([[1],
       [2],
       [3],
       [2],
       [3],
       [4]])
  • np.hstack()
    Stack arrays in sequence horizontally (column wise).
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.hstack((a,b))
array([1, 2, 3, 2, 3, 4])
>>> a = np.array([[1],[2],[3]])
>>> b = np.array([[2],[3],[4]])
>>> np.hstack((a,b))
array([[1, 2],
       [2, 3],
       [3, 4]])
``
  • np.concatenate()

    Join a sequence of arrays along an existing axis.

>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

   以下内容有需要可自行查找:
 - np.stack()
  - dstack()
 - np.column_stack()
 - np.ma.row_stack()
 - np.r_()
 - np.c_()

对于 np.concatenate()需要注意的是,其参数是一个可迭代对象,别忘记加一个**“括号”**,

concatenate((a1, a2, …), axis=0, out=None)

比如列表或者元组,比如:

y = np.concatenate([1.,2.,3.], [4.,5.,6.])
print(y) 

TypeError: 'list' object cannot be interpreted as an integer
y = np.concatenate(([1.,2.,3.], [4.,5.,6.]))
print(y) 
[1. 2. 3. 4. 5. 6.]

注意,
①合并时,数组大小的要求

② np.vstack()、np.hstack()和np.concatenate()的区别:
In general, for arrays with more than two dimensions, hstack stacks along their second axes, vstack stacks along their first axes, and concatenate allows for an optional arguments giving the number of the axis along which the concatenation should happen.

  1. 分割数组
  • np.hsplit()
    Split an array into multiple sub-arrays horizontally (column-wise).
    不论数组是几维的,都根据第二根轴(axis=1)来进行分割数组。(二维的情况是水平方向)
    split() 实际上等价于 split 轴=1的情况。
>>> x = np.arange(16.0).reshape(4, 4)
>>> x
array([[ 0.,   1.,   2.,   3.],
       [ 4.,   5.,   6.,   7.],
       [ 8.,   9.,  10.,  11.],
       [12.,  13.,  14.,  15.]])
>>> np.hsplit(x, 2)
[array([[  0.,   1.],
       [  4.,   5.],
       [  8.,   9.],
       [12.,  13.]]),
 array([[  2.,   3.],
       [  6.,   7.],
       [10.,  11.],
       [14.,  15.]])]
>>> np.hsplit(x, np.array([3, 6]))
[array([[ 0.,   1.,   2.],
       [ 4.,   5.,   6.],
       [ 8.,   9.,  10.],
       [12.,  13.,  14.]]),
 array([[ 3.],
       [ 7.],
       [11.],
       [15.]]),
 array([], shape=(4, 0), dtype=float64)]

即是是三维,也是按照axis=1的情况进行分割。

>>> x = np.arange(8.0).reshape(2, 2, 2)
>>> x
array([[[0.,  1.],
        [2.,  3.]],
       [[4.,  5.],
        [6.,  7.]]])
>>> np.hsplit(x, 2)
[array([[[0.,  1.]],
       [[4.,  5.]]]),
 array([[[2.,  3.]],
       [[6.,  7.]]])]

当然也可以自己指定分割的位置:

>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[ 9.,  5.,  6.,  3.,  6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.],
       [ 1.,  4.,  9.,  2.,  2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])
>>> np.hsplit(a,3)   # Split a into 3
[array([[ 9.,  5.,  6.,  3.],
       [ 1.,  4.,  9.,  2.]]), array([[ 6.,  8.,  0.,  7.],
       [ 2.,  1.,  0.,  6.]]), array([[ 9.,  7.,  2.,  7.],
       [ 2.,  2.,  4.,  0.]])]
>>> np.hsplit(a,(3,4))   # Split a after the third and the fourth column
[array([[ 9.,  5.,  6.],
       [ 1.,  4.,  9.]]), array([[ 3.],
       [ 2.]]), array([[ 6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.],
       [ 2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])]
  • np.vsplit()
    vsplit splits along the vertical axis.
    vsplit根据竖直方向来进行分割(二维的情况)

  • array_split()
    array_split需要自己指定位置来进行分割。

4. 拷贝和视图(Copies and Views)

当我们使用和操作数组的时候,有时候拷贝它们的数值,创建一个新数组,但有时候却不是。实际上,有以下三种情况:

  1. 完全不是拷贝
    单纯赋值(assignments )而非复制数组或者他们的数值。

>>> a = np.arange(12)
>>> b = a            # no new object is created
>>> b is a           # a and b are two names for the same ndarray object
True
>>> b.shape = 3,4    # changes the shape of a
>>> a.shape
(3, 4)

Python中的函数调用不是拷贝,只是一种可变对象的引用。

>>> def f(x):
...     print(id(x))
...
>>> id(a)                           # id is a unique identifier of an object
148293216
>>> f(a)
148293216
  1. 视图或者说是浅拷贝
>>> c = a.view()
>>> c is a
False
>>> c.base is a                        # c is a view of the data owned by a
True
>>> c.flags.owndata
False
>>>
>>> c.shape = 2,6                      # a's shape doesn't change
>>> a.shape
(3, 4)
>>> c[0,4] = 1234                      # a's data changes
>>> a
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])

切片操作就是一种浅拷贝/视。

>>> s = a[ : , 1:3]     # spaces added for clarity; could also be written "s = a[:,1:3]"
>>> s[:] = 10           # s[:] is a view of s. Note the difference between s=10 and s[:]=10
>>> a
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])
  1. 深拷贝
>>> d = a.copy()                          # a new array object with new data is created
>>> d is a
False
>>> d.base is a                           # d doesn't share anything with a
False
>>> d[0,0] = 9999
>>> a
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])

如果在切片操作之后,原来的数组不再被需要,则应在其后调用copy()。

>>> a = np.arange(int(1e8))
>>> b = a[:100].copy()
>>> del a  # the memory of ``a`` can be released.

如果这里使用 b = a[:100],则 b 是 a 的引用,而且即使之后使用 del a 操作 b 也会一直存在于内存中。

——————————————————————
以上是 NumPy Quickstart 的 Basic 部分,
推荐参考下面两个连接:
NumPy官方文档-https://numpy.org/devdocs/user/quickstart.html#no-copy-at-all

和一篇NumPy可视化的文章-https://jalammar.github.io/visual-numpy/
对理解很有帮助。

写在最后的思考

NumPy是Python数据分析的基石,很多科学库比如Scipy、Pandas和Matplotlib可以说都是建立在它的基础之上,所以光简单了解这些概念和用法是不够的,需要进一步加深理解,通过多加练习去逐渐掌握,所以有了后面的(2)- 深入理解 和(3)- 练习 的想法。

《Python数据分析与展示》讲解numpy,Matplotlib,pandas 详细笔记 第0周 Python基本语法元素 conda: 一个工具,用于包管理和环境管理,其中:包管理与pip类似,管理Python第三方库环境管理能够允许用户使用不同版本Python,并能灵活切换 anaconda:一个集合,包括conda、某版本Python、一批第三方库等 conda将工具、第三方库、Python版本、conda都当作包,同等对待 ipython 第1周 数据分析之表示 单元... 阅读详情

相关推荐

快速入门Pandas和NumPy数据分析

大家好,从商业智能到科学研究,数据分析在许多领域中都是一项重要技能。Python因其可读性强和强大的库生态系统而成为最受欢迎的数据分析语言之一,Pandas和NumPy是重要的基础工具,适用于任何想要分析和解释数据的人。本文将探讨如何使用这些库,内容涵盖了从Pandas中的基本数据操作到NumPy中的统计分析。

csdn1561168266的博客 1884

Numpy系列(一)array对象以及创建array的方法总结

  Numerical Python(Numpy)是一个开源的Python科学计算库,使用Numpy可以方便的使用数组、矩阵进行计算,包含线性代数、傅里叶变换、随机数生成等大量函数。   与原生的Python实现相比,使用Numpy是直接以数组、矩阵为粒度计算,并且支持大量的数学函数,而Python需要用for循环从底层实现。并且Numpy的数组存储效率和输入输出计算性能,比Python使用List或者嵌套List好很多。   Numpy的数据存储和Python原生的List是不一样的,Numpy的大部分代

小小何先生的学习之旅 2974

[Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)

前一篇文章讲述了Selenium基础技术,通过三个基于Selenium技术的爬虫,爬取Wikipedia、百度百科和互动百科消息盒的例子,从实际应用出发来学习网络爬虫。本文将进入数据分析部分,主要普及网络数据分析的基本概念,讲述数据分析流程和相关技术,同时详细讲解Python提供的若干第三方数据分析库,包括Numpy、Pandas、Matplotlib、Sklearn等。基础文章,希望对您有所帮助。

杨秀璋的专栏 1万+

NumPy基础之array创建ndarray多维数组

NumPy(Numerical Python)是一个python库,提供多维数组对象及其派生对象,以及用于数组快速操作的各种API。它运行速度快,用于数值计算,是python中科学计算的基础包。

sinat_34735632的博客 1354

xhs私信协议分析

之前分析过xhs的shield算法,今天再聊聊xhs的私信,文章仅供学习参考研究交流,如有侵权请联系删帖。经过抓包分析发现私信接口并不是走的http协议,而是socket协议。而要获取socket包则需要使用wireshark软件1、protobuf的包体中的序号7,多次验证后发现文字信息的需要需要固定成12、protobuf的包体中的序号12,多次验证后发现文字信息的需要需要固定成1后续有时间的话,再研究一下视频和图片格式的私信协议,这次就分析到这里吧。

佛系更新... 3485

告别Keil?在Mac上配置STM32CubeIDE + CMSIS-DAP调试器全攻略(含常见报错解决)

本文详细介绍了在Mac平台上配置STM32CubeIDE与CMSIS-DAP调试器的全流程,包括硬件准备、软件安装、工程创建及调试优化。通过实战指南,帮助开发者高效完成STM32开发,解决常见报错问题,提升开发效率。

weixin_30485379的博客 431

Spark学习之RDD简单算子

collect 返回RDD的所有元素 scala>varinput=sc.parallelize(Array(-1,0,1,2,2)) input:org.apache.spark.rdd.RDD[Int]=ParallelCollectionRDD[15]atparallelizeat<console>...

weixin_34090643的博客 133

EndNote20保姆级安装教程:从下载到汉化一步到位(附闪退解决方案)

本文提供EndNote20的详细安装与汉化教程,涵盖系统准备、分步安装、路径优化及闪退解决方案。针对科研人员的需求,特别优化了中文环境下的使用体验,确保文献管理工具的高效稳定运行。

weixin_30415113的博客 339

CopyOnWriterArrayList 详解

在 ArrayList 的类注释上,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList。......

GeGe&YoYo的博客 1万+

基于STM32H5的循环GPDMA链表使用

STM32H503的GPDMA链表模式可实现灵活的数据传输。相比传统DMA直接编程方式,链表模式通过配置多个节点实现分散数据传输,支持循环链表功能。示例展示了如何使用GPDMA链表实现UART1循环发送数据:配置两个DMA节点分别指向不同发送缓冲区,构建循环链表并绑定到DMA通道。关键点包括:清空链表结构体、正确设置循环模式、检查节点配置。此方法提高了DMA使用的灵活性,适用于需要交替传输多段数据的场景。

kevin1499的博客 451

AI摄影师:自动构图与修图算法设计

AI摄影师:自动构图与修图算法设计​ ,人工智能,计算机视觉,大模型,AI,AI 摄影师的核心能力体现在两方面:自动构图(通过算法优化画面元素布局)与智能修图(自动调整光影、色彩、细节)。例如,手机摄影中的 “AI 构图建议” 功能可实时框选最佳拍摄区域,修图软件中的 “一键增强” 能在 0.1 秒内完成专业级调色,这些都依赖于计算机视觉与深度学习的深度融合。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

CopyOnWriteArrayList详解

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33979363的博客 404

第一节:初识n8n与下一代工作流自动化

本章介绍了n8n的Fair-code理念与节点式架构,对比了其与Zapier/Make的核心差异,并引导读者在n8n Cloud上完成首次界面导览,建立了工作流自动化的宏观认知。

easeyoo的专栏 105

Python 数据分析:NumPy 库的使用

NumPy的核心价值在于提供了高效的多维数组结构和底层计算能力,但它并非“全能”——例如,处理带标签的表格数据时,Pandas会更方便;可视化时需要Matplotlib配合。然而,所有上层库(如Pandas、Scikit-learn)的底层数据结构都是基于NumPy的ndarray。因此,掌握NumPy是进入Python数据分析领域的“必修课”。下一篇文章,我们将基于NumPy,深入讲解Pandas的DataFrame操作,带你从“数组处理”进阶到“表格数据大师”!

yue_yun_的博客 2588

电机瞬态分析基础(2):理想电机的基本假设和正方向规定

电机瞬态分析基础之理想电机假设条件和正方向规定

weixin_45670943的博客 1145

从底层结构开始学习FPGA(7)----进位链CARRY4

进位链CARRY4在FPGA实现加减法运算时扮演了什么角色?

孤独的单刀 1万+

【转】python数据分析入门学习笔记

python数据分析入门学习笔记 目录 一、 数据分析有关的python库简介 (一)numpy (二)pandas (三)matplotlib (四)scipy (五)statsmodels (六)scikit-learn 二、 数据的导入和导出 三、 数据筛选 四、 数据描述 五、 数据处理 六、 统计分析 七、 可视化 八、 其它 前言:各种和数据分析相关python库的介绍(前言1~4摘抄自《利用python进行数据分析》) 1.N...

weixin_52071682的博客 3037

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Numpy快速入门

写在前面 这篇博客是针对想入门机器学习和深度学习,或者数据分析的小白而写,我们都知道机器学习和深度学习,数据分析的编程基础就是Python编程,而最常用的一些库,像numpy,pandas,matplotlib,sklearn等这些库都必须熟记于心,如果学习深度学习的话,还必须有着深度学习基础,掌握一些主流的TensorFlow,pytorch等框架才能在这条路上走下去。 而在信息发展很快的时代,...

Miracle8070 1574

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NumPy 快速入门——《Python数学函数库NumPy》

NumPy是一个功能强大的数值计算库,为Python提供了高效的多维数组对象和大量的数学运算函数。通过本文的快速入门指南,您已经了解了NumPy的基础知识、形状操作、广播规则、索引技巧以及线性代数、统计、随机数生成等高级功能。随着您在实际项目中的不断实践,您将能够更深入地掌握NumPy,并利用它提升数值计算和数据分析的效率。

Python老吕的博客 1297

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一篇文章让你快速入门Pandas

目录Pandas介绍简单介绍Pandas的基本功能Pandas的优势数据结构为什么有多个数据结构大小可变与数据复制Pandas的基本内容Pandas的基础方法数据的生成与有关方法一维数组二维数组数组的其余方法Pandas的选择数据用标签选取数据切片利用iloc进行选择Boolean indexing布尔索引Pandas的缺失值处理删除缺失值的行填充缺失值提取NAN值的布尔掩码Pandas的运算统计合并concat合并join合并append追加Pandas数据的导入与导出数据导入数据导出应用实例Pandas

qq_51718832的博客 2578

【优质书籍推荐】Python数据分析快速上手与项目实战

本文深入讲解了Python数据分析优质书籍:《Python数据分析快速上手》,希望能对学习Python和数据分析的同学们有所帮助。 文章目录 1. 前言 2. 书籍推荐 2.1 内容简介 2.2 本书作者 2.3 本书目录 2.4 适合读者 3. 购买链接

herosunly的博客 3万+

Python 与数据科学工具链入门:NumPy、Pandas、Matplotlib 快速上手

本文介绍了Python数据科学三大核心工具(NumPy、Pandas、Matplotlib)的快速入门方法。首先强调了工具链的重要性,指出NumPy提供高效的数值计算,Pandas简化数据处理,Matplotlib实现数据可视化。文章详细讲解了如何搭建开发环境(推荐Anaconda),并通过实际代码示例演示了NumPy数组操作、Pandas数据框处理以及数据清洗技巧。这些工具共同构成了机器学习项目的基础设施,掌握它们能显著提高数据分析和建模效率。

htw250056的博客 4381

Python 学习 ---> Numpy可视化、快速入门、基础知识

NumPy是Python中用于科学计算的基本包。它是一个Python库,提供多维数组对象、各种派生对象(如掩码数组和矩阵),以及一系列用于快速操作数组的例程,包括:数学、逻辑、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计操作、随机模拟 等等。 NumPy 包的核心是 ndarray 对象。这它封装了相同数据类型的n维数组,为了提高性能,许多操作都是在编译后的代码中执行。

freeking101的博客 1万+

人工智能从入门到精通:NumPy 与 Pandas 数据分析基础

本文介绍了Python数据分析两大核心库NumPy和Pandas的基础知识。NumPy部分讲解了数组创建、操作、向量化运算和广播机制,以及丰富的数学函数。Pandas部分介绍了Series和DataFrame数据结构的基本使用,以及数据读取写入方法。文章包含大量代码示例,帮助读者掌握数组处理、数学运算、数据加载等基础操作,为后续数据分析任务奠定基础。

编程世界如山海,探索不止。 1万+

【数据分析入门】Numpy基础

本文为《基于Python的数据分析大全》中的第一篇,代码量较大。全文介绍了Numpy基础相关知识点,主要包括:Numpy数组介绍、创建数组、输入输出、数据类型、数组信息、调用帮助、数组计算、数组复制、数组排序、子集切片索引、数组操作等,注重实际应用。

東方緋想天 2029

Python数据分析入门:Pandas与NumPy实战

本文介绍了使用Python进行数据分析的基础流程,重点讲解了NumPy和Pandas两大核心库的实战应用。内容包括:1)通过Anaconda搭建开发环境;2)NumPy的数组操作、切片和广播机制;3)Pandas的DataFrame创建、缺失值处理和筛选技巧;4)常见数据读取问题和类型转换方法;5)通过学生成绩分析案例演示数据统计、排序和可视化(柱状图、饼图等)。文章强调实践的重要性,建议通过真实数据集练习,逐步掌握从数据处理到分析可视化的完整流程。

2503_93373937的博客 1433
上一篇: 使用优快云-markdown编辑器
下一篇: Python数据分析之Pandas(1)——Pandas官方文档解读:一篇文章 Pandas 快速上手
Robin_Pi
博客等级 码龄9年 2万+粉丝 632原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值