Numpy数组使用总结

1.Numpy数组的创建

1.1 手动创建

1.创建一维数组

a = np.array([2, 5, 1, 4, 3, 9, 8])

2.创建二维数组

a = np.array([[2, 5, 1, 4, 3, 9, 8],[2,3,4,5,6,1,3]])

3.更高维数组以此类推
。。。。。。

1.2利用函数的创建

numpy拥有丰富的函数用于创建各式各样的多维数组,例如全0数组,全1数组,服从正态分布的数组等。
1.利用函数创建全0或者全1数组

a = np.zeros(10)
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

b = np.zeros(shape=(2,3))
[[ 0.  0.  0.]
 [ 0.  0.  0.]]

c = np.ones(shape=(2,4))
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]

2.生成空的数组(内部的值是随机初始化的值),不建议使用。

d = np.empty(shap=(2,3))
[[  1.32971156e-152   2.45883933e+198   2.31634004e-152]
 [  2.21705231e+068   2.45886150e+198  -5.68511526e-310]]

3.生成正态分布的数组(数组里面的所有元素服从正态分布)

b = np.random.normal(size=(10,2,4))

numpy.random模块对python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本生成函数。

4.创建元素有序增减的数组

a = np.arange(1, 10, 0.5)
[ 1.   1.5  2.   2.5  3.   3.5  4.   4.5  5.   5.5  6.   6.5  7.   7.5  8.  8.5  9.  9.5]

1:指定起始值(能够取到)、10:终止值(取不到),0.5:步长。区间遵守左必又开原则。

如果要生成这样的数组呢?
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]
可以用以下的的方式:

a = np.arange(0, 60, 10)#1
b = np.arange(6)#2
c = a.reshape((-1, 1))#3
d = c + b #4

a: [ 0 10 20 30 40 50]
b: [ 0 1 2 3 4 5]
c:
[[ 0]
[10]
[20]
[30]
[40]
[50]]
c + b利用广播机制,得到的上述数组。
说明:reshape方法,可以创建改变了尺寸的新数组,原数组的shape保持不变,如果使用a.shape = (-1,1)不会得到新副本。例如从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变

2.Numpy数组的切片

需要注意的是,通过切片得到的数组是原数组的一个视图,与原数组共享内容空间,如果直接修改切片数组,会影响原数组。

A = np.array([0, 1, 2])
a = A[0:1]
a[0] = 5
print(A)
#########
[5 1 2]

2.1读取一个元素
1维数组a[i]
2维数据a[i][j]
以此类推……

2.2读取一行中第x到第y的数据,或者跳着读,或者反着读
2.2.1a是一维数组
a[x:y] #第y是读不到的,左闭又开
a[:y] #从0到y的数据
a[x:y:step] #step为读取步长

2.2.2读取特定一行,a为二维数组
a[i] # 读取第i行

2.2.3读取特定的几行(如第0行,第2行,第3行)
a[[0,2,3]]
#如果行标是连续的,可以直接写成
a[x:y]

2.2.4读取数组中某一区域的数组,比如第1-2行,2-3列的数据
a[1:3,[2,3]],
但是如果是这样的话,a[[0, 1, 2], [2, 3, 4]],读取的数据为a[0][2],a[1][3],a[2][4].可以再研究一下。

2.2.5读取特定一列(几列),a为二维数组
1.先将a转置,a.T
2.在读取第0行a.T[0](也就是一开始的第0列。
或者a[:,1] 取出第1列

2.2.6选出数组中大(小,等)于某个值的所有元素
#a为一维数组
a = np.random.rand(10)
print a > 0.5 # 得到 [False True False True True False True True False False]
如果a是二维数组,则返回一个二维的bool数组。
a[a>0.5] # 得到a中大于0.5的数据
#a为二维数组,按某列的值得大小,得到一整行
步骤大概是,1将a转置,取出对应的行(也就是原始的列),通过遍历得到True的下标,然后用下标取出原始数组对应的行。

#####利用for循环对numpy进行遍历
a = np.arange(15).reshape(5,-1)
for i in a: #得到第i行
for j in i: # 得到第i行中,第j个元素
print j

3.元素去重

3.1一维数组元素去重

直接使用库函数unique
a = np.array((1, 2, 3, 4, 5, 5, 7, 3, 2, 2, 8, 8))
b = np.unique(a)
a:[1 2 3 4 5 5 7 3 2 2 8 8]
b:[1 2 3 4 5 7 8]

3.2二维数组元素去重

如果直接使用unique二维数组的去重,结果就会变成如下这个样子。

c = np.array(((1, 2), (3, 4), (5, 6), (1, 3), (3, 4), (7, 6)))
np.unique(c)
#############
[1 2 3 4 5 6 7]
方案一:转化为虚数

r, i = np.split(c, (1, ), axis=1)
x = r + i * 1j
x = c[:, 0] + c[:, 1] * 1j
print ‘转换成虚数:’, x
print ‘虚数去重后:’, np.unique(x)
print np.unique(x, return_index=True) # 思考return_index的意义
idx = np.unique(x, return_index=True)[1]

方案二:利用set
np.array(list(set([tuple(t) for t in c])))
3.2 一维数组重复元素统计

利用pandas的顶级函数value_counts()

b = np.array([1,1,2,2,4,4])
print(pd.value_counts(b))
4    2
2    2
1    2

此方法返回的是series对象

### 将NumPy数组转换为列表的方法 在Python中,可以通过`tolist()`函数将NumPy数组轻松转换为标准的Python列表。此方法适用于各种维度的NumPy数组。 #### 一维NumPy数组转换为列表 对于一维NumPy数组,可以直接调用`.tolist()`方法完成转换: ```python import numpy as np # 创建一维NumPy数组 arr = np.array([1, 2, 3]) print(f'NumPy Array:\n{arr}') # 转换为列表 list1 = arr.tolist() print(f'List: {list1}') ``` 上述代码展示了如何将一维NumPy数组转换为列表[^1]。 #### 多维NumPy数组转换为嵌套列表 对于多维NumPy数组,同样可以使用`.tolist()`方法将其转换为嵌套列表结构: ```python import numpy as np # 创建二维NumPy数组 arr_2d = np.array([[1, 2], [3, 4]]) print(f'2D NumPy Array:\n{arr_2d}') # 转换为嵌套列表 nested_list = arr_2d.tolist() print(f'Nested List: {nested_list}') ``` 该方法能够保持原始数组的形状和层次结构不变。 --- 如果需要从其他数据类型(如字符串或C类型的数组)转换为NumPy数组后再进一步转化为列表,则可参考以下扩展方法: #### 字符串表示数组转换为NumPy数组并转为列表 当输入是一段字符串形式的数组时,可以先解析字符串再创建NumPy数组,最后调用`.tolist()`方法实现转换: ```python import numpy as np s = '[0 1 2 3]' a = np.fromstring(s[1:-1], dtype=np.int, sep=' ') converted_list = a.tolist() print(f'String Representation: {s}') print(f'Converted List: {converted_list}') ``` 这里利用了`np.fromstring`来处理字符串格式的数据[^2]。 #### C类型数组转换为NumPy数组并转为列表 借助`ctypes`模块可以从C语言风格的数组构建NumPy对象,并最终得到对应的列表表示: ```python from ctypes import * import numpy as np # 假设有一个C字节数组 my_cbyte_array = (c_uint8 * 5)(1, 2, 3, 4, 5) # 使用frombuffer将C数组转换为NumPy数组 my_nparray = np.frombuffer(my_cbyte_array, dtype=np.uint8) # 继续转换为列表 final_list = my_nparray.tolist() print(f'C Byte Array Converted to List: {final_list}') ``` 这段代码说明了如何通过`numpy.frombuffer`结合`tolist()`操作达成目标[^3]。 --- ### 总结 无论是简单的单维还是复杂的多维情况,亦或是特殊场景下的间接转化需求,都可以依赖于NumPy提供的高效工具集完成向Python原生列表的形式转变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值