[Python]numpy数据分析练习[1~20]]
Posted 鱼竿钓鱼干
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python]numpy数据分析练习[1~20]]相关的知识,希望对你有一定的参考价值。
[Python]numpy数据分析练习[1~20]]
题目地址
建议把老师发的没答案的做了然后校对,答案代码在上面链接里有,这篇博客主要记一下笔记
题目及解析
1、导入numpy作为np,并查看版本
import numpy as np
print(np.__version__)
2、如何创建一维数组?
创建从0到9的一维数字数组
import numpy as np
arr=np.arange(10)
print(arr)
3. 如何创建一个布尔数组?
创建一个numpy数组元素值全为True(真)的数组
使用ones
生成全1数组,类型为bool
型,注意ones
拼写有s
import numpy as np
arr=np.ones((3,3),dtype=bool)
print(arr)
使用full
填充,记住full需要告诉用什么填充
import numpy as np
arr=np.full((3,3),True,dtype=bool)
print(arr)
4.如何从一维数组中提取满足指定条件的元素?
从 arr 中提取所有的奇数
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr[arr%2==1])
arr%2==1
也是ndarray
类
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr%2==1)
print(type(arr%2==1))
print(arr[[False,True,False,True,False,True,False,True,False,True]])
输出
[False True False True False True False True False True]
<class 'numpy.ndarray'>
[1 3 5 7 9]
实际上这玩意就是布尔索引
布尔型索引指的是一个布尔型ndarray数组(一般为一维)对应另一个ndarray数组的每行,布尔型数组的个数要必须与另一个多维数组的行数一致。若布尔型数组内的某个元素为True,则选取另一个多维数组的行,反之不选取。
5. 如何用numpy数组中的另一个值替换满足条件的元素项?
将arr中的所有奇数替换为-1。
原理同上,操作的时候考虑先筛选出来,然后再赋值
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[arr%2==1]=-1
print(arr)
6. 如何在不影响原始数组的情况下替换满足条件的元素项?
将arr中的所有奇数替换为-1,而不改变arr。
使用copy
,out
和arr
是完全没有关系的
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
out=arr.copy()
out[out%2==1]=-1
print(out)
print(arr)
使用where
相当于一个三目运算符
np.where(条件,如果为真的操作,如果为假的操作)
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
out=np.where(arr%2==1,-1,arr)
print(arr)
print(out)
7. 如何改变数组的形状?
将一维数组转换为2行的2维数组
使用reshape
改变数组形状,设置-1自动换行
import numpy as np
arr=np.arange(10)
print(arr.reshape(2,-1))
8.如何垂直叠加两个数组
垂直堆叠数组a和数组b
使用vstack
垂直堆叠
import numpy as np
a = np.arange(10).reshape(2,-1)
b = np.repeat(1, 10).reshape(2,-1)
print(np.vstack((a,b)))#也可以传[a,b]但记住,别写成np.vstack(a,b)
使用concatenate
连接多个数组,axis默认为0
print(np.concatenate([a,b],axis=0))
使用r_[a,b]
将切片对象沿第一个轴(按行)连接c_[a,b]
沿第二个轴拼接(按列)
print(np.r_[a,b])
9. 如何水平叠加两个数组?
同上
import numpy as np
a = np.arange(10).reshape(2,-1)
b = np.repeat(1, 10).reshape(2,-1)
print(np.c_[a,b])
print(np.concatenate([a,b],axis=1))
print(np.hstack([a,b]))
10. 如何在无硬编码的情况下生成numpy中的自定义序列?
创建以下模式而不使用硬编码。只使用numpy函数和下面的输入数组a
给定
a = np.array([1,2,3])
期望输出
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])
答案
硬编码是将数据直接嵌入到程序或其他可执行对象的 源代码 中的软件开发实践。就是不能直接输入数据,要用函数生成
拆分成两部分,前一部分使用repeat
让a的每个元素重复3次,后一部分使用tile
让整个a重复3次
import numpy as np
a=np.array([1,2,3])
print(np.hstack((np.repeat(a,3),np.tile(a,3))))
11. 如何获取两个numpy数组之间的公共项?
获取数组a和数组b之间的公共项。
使用intersect1d
求交集
注意是1d
不是ld
!!
注意是1d
不是ld
!!
注意是1d
不是ld
!!
import numpy as np
a = np.array([1,2,3,2,3,4,3,4,5,6])
b = np.array([7,2,10,2,7,4,9,4,9,8])
print(np.intersect1d(a,b))
其他相关操作
import numpy as np
a = np.array([1,2,3,2,3,4,3,4,5,6])
b = np.array([7,2,10,2,7,4,9,4,9,8])
print(np.intersect1d(a,b))#求交集
print(np.setdiff1d(a,b))#求差集
print(np.setxor1d(a,b))#求异或集(仅仅存在于一个里)
print(np.union1d(a,b))#求并集
12. 如何从一个数组中删除存在于另一个数组中的项?
使用setdiff1d
求差集
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([5,6,7,8,9])
print(np.setdiff1d(a,b))#求差集
13. 如何得到两个数组元素匹配的位置?
使用where
进行筛选
只有condition条件的时候结果是符合条件的位置信息
可以看一下这篇文章
import numpy as np
a = np.array([1,2,3,2,3,4,3,4,5,6])
b = np.array([7,2,10,2,7,4,9,4,9,8])
index=np.where(a==b)
print(index)
14. 如何从numpy数组中提取给定范围内的所有数字?
获取5到10之间的所有项目
使用where
先获取符合条件的下标,然后通过索引输出对应的值
但是where
里面好像不支持连写,也不让用and
import numpy as np
a = np.array([2, 6, 1, 9, 10, 3, 27])
index=np.where((a>=5)&(a<=10))
print(a[index])
其他操作
import numpy as np
a = np.array([2, 6, 1, 9, 10, 3, 27])
print(a[(a>=5)&(a<=10)])
15. 如何创建一个python函数来处理scalars并在numpy数组上工作?
转换适用于两个标量的函数maxx,以处理两个数组
给定
def maxx(x, y):
"""Get the maximum of two items"""
if x >= y:
return x
else:
return y
maxx(1, 5)
# > 5
期望输出
a = np.array([5, 7, 9, 8, 6, 4, 5])
b = np.array([6, 3, 4, 8, 9, 7, 1])
pair_max(a, b)
# > array([ 6., 7., 9., 8., 9., 7., 5.])
答案
知识盲区了啊啊
首先,python的标量(scalars)是什么?
请参看这篇文档
函数如何处理数组?重写一个参数为数组的!然而这题要求转换,也就是不能动原来的函数。
我们可以使用vectorize
来整
numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)
Parameters:
pyfunc :python函数或方法
otypes : 输出数据类型。必须将其指定为一个typecode字符串或一个数据类型说明符列表。每个输出应该有一个数据类型说明符。
doc : 函数的docstring。如果为None,则docstring将是 pyfunc.__doc__。
excluded : 表示函数不会向量化的位置或关键字参数的字符串或整数集。这些将直接传递给未经修改的pyfunc
cache :如果为True,则缓存第一个函数调用,该函数调用确定未提供otype的输出数。
signature : 广义通用函数签名,例如,(m,n),(n)->(m)用于矢量化矩阵 - 向量乘法。如果提供的话,pyfunc将调用(并期望返回)具有由相应核心维度的大小给出的形状的数组。默认情况下,pyfunc假定将标量作为输入和输出。
Returns:
vectorized :向量化的数组
import numpy as np
def maxx(x, y):
"""Get the maximum of two items"""
if x >= y:
return x
else:
return y
pair_max=np.vectorize(maxx,otypes=[float])
a = np.array([5, 7, 9, 8, 6, 4, 5])
b = np.array([6, 3, 4, 8, 9, 7, 1])
print(pair_max(a, b))
16. 如何交换二维numpy数组中的两列?
在数组arr中交换列1和2。
import numpy as np
arr = np.arange(9).reshape(3,3)
print(arr)
print(arr[:,[1,0,2]])
17. 如何交换二维numpy数组中的两行?
交换数组arr中的第1和第2行:
import numpy as np
arr = np.arange(9).reshape(3,3)
print(arr)
print(arr[[1,0,2],:])
18. 如何反转二维数组的行?
::-1
反转
import numpy as np
arr = np.arange(9).reshape(3,3)
print(arr)
print(arr[::-1,:])
19. 如何反转二维数组的列?
import numpy as np
arr = np.arange(9).reshape(3,3)
print(arr)
print(arr[:,::-1])
20. 如何创建包含5到10之间随机浮动的二维数组?
创建一个形状为5x3的二维数组,以包含5到10之间的随机十进制数
使用random.uniform
构建随机二维数组
import numpy as np
arr=np.arange(9).reshape(3,3)
rand_arr=np.random.uniform(5,10,size=(5,3))
print(rand_arr)
以上是关于[Python]numpy数据分析练习[1~20]]的主要内容,如果未能解决你的问题,请参考以下文章