[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,outarr是完全没有关系的

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]]的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析numpy入门-------numpy100题练习

[Python]numpy数据分析练习[21~30]

python基础练习—— 数据分析包numpy数组操作

Python Numpy

机器学习入门——numpy100练习题

Python数据科学Numpy速查