numpy简单入门

numpy数以数组为对象,将各种数据转化成数组,因此,我们学习的也就是数组了,实际上它被称之为 ndarrays。

创建一个数组:

import numpy as np

my_array = np.array([1, 2, 3, 4, 5])
print(my_array)
print(my_array.shape)

创建全部为0 的数组:

import numpy as np

my_zeros_array = np.zeros(5)
print(my_zeros_array)

创建数组:

import numpy as np
# 用列表生成数组
a = np.array([0, 1, 2, 3, 4])
# 用元组生成数组
b = np.array((0, 1, 2, 3, 4, 5))
# 产生0到4的整数数组,包头不包尾
c = np.arange(5)
# 从0到100,以10作为差值求等差数列
e = np.arange(0, 100, 10) 
# 产生0到2*np.pi的等差数列,并且一共五个,可以得出差值为2*np.pi/(5-1) = 1.5707963267948966 
d = np.linspace(0, 2*np.pi, 5) print(a) print(b) print(c) print(d)

多维数组:

import numpy as np


# MD Array,
a = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28 ,29, 30],
              [31, 32, 33, 34, 35]])

# 以0作为数组的下标
print(a[0, 0])
# 可以使用负数倒数去取值
print(a[-1, -1])
# 数组切片是包头不包尾
print(a[2, 1:4])
# 对比一下这个跟原生的python规则一致
d = [1, 2, 3, 4, 5]
print(d[1:4])

数组的属性:

import numpy as np


# Array properties,
a = np.array([[11, 23, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])

# <class 'numpy.ndarray'>
print(type(a))

# object 这个不准确,有时候是int32 有时候是int64 还有的是其他float,string等这个是根据这个数组的值决定
print(a.dtype)  # int32
# 1、如果里面的额数值都是int并且值不大于-2^31 ~ 2^31-1次方=4294967295,由于则显示为int32
# 来感受一下吧
# int32
a = np.array([[11, 23, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 2147483647]])
print(a.dtype)
# int64
a = np.array([[11, 23, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 2147483648]])
print(a.dtype)
# 那么,64的极限在哪里?你可能想到了,就是-2^63 ~ 2^63-1
a = np.array([[11, 23, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 2**63-1]])
print(a.dtype)
# 比int还要大一点呢?那就是float64了
a = np.array([[11, 23, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 2**63]])
print(a.dtype)
# 比float大一点点呢?那就是object了
a = np.array([[11, 23, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 2**64]])
print(a.dtype)

在这里我要强行解释一波,哪里不对的地方请各位道友多多指出

1、为什么int32是用2^32次方的算数呢?因为计算机中都是由0或1组成的数据,也就是两种情况(2就被推出来送命啦),而32是表示32位的意思,那“位”又是什么?位是计算机的最小存储单元(也就是存放0或1 的那个单元,你可以理解成牢房),8位为一个字节,因此int32又称4个字节。字节是计算机中的最小单位。

  那为什么是-2^31~2^31-1这个范围呢?而不是0~2^32-1这个范围呢?你的理解非常正确,无符号整型就是这个范围,那就好理解了,因为有正负号,所以就是-2^31~2^31-1。

  还有,为什么是-2^31~2^31-1而不是-2^31~2^31呢?都说对半分嘛,怎么正数反而要减去一个1呢?没错,你的怀疑不无道理,可以这样就有一个棘手的问题,1可以表示位00000000 00000000 0000000 00000001 ,而-1可以表示为 10000000 00000000 00000000 00000001,那么0呢?当然,0有两种情况-0和0,你可能很疑惑,怎么有-0呢?没办法还真的有。因此-0和0占去一位都是0,所以就需要负数或者正数减去一个1。int64也一样。

2、我也有个疑问,为什么float取值范围要比int64还要大?因为他们都是64位存储对吧?而且float类型还要用一位来记录小数点,没错吧!

  我也是想当然,不过如果我们学过C或者更加底层的汇编,你就会发现,浮点的存储跟整型不一样,他是可能损失精度的,比如1000000 整型就傻傻的将所有1000000转化为二进制存放,而浮点类型不一样,会转化成1.e7,也就是将一部分保留,另一部分以幂次方表示,从而扩大其取值范围。

3、没想好,就先这样吧~!

Where 函数

where() 函数是另外一个根据条件返回数组中的值的有效方法。只需要把条件传递给它,它就会返回一个使得条件为真的元素的列表。

import numpy as np

a = np.arange(0, 100, 1)
print(a)
b = a[:5]
c = a[a >= 50]
print(b) # >>>[ 0 10 20 30 40]
print(c) # >>>[50 60 70 80 90]

原文地址:https://www.cnblogs.com/hardykay/p/11287040.html