numpy小知识-v2

发布于:2024-03-27 ⋅ 阅读:(72) ⋅ 点赞:(0)

1.【pytorch】——torch.unique

官方文档https://pytorch.org/docs/stable/generated/torch.unique.html

torch.unique(input, sorted=True, return_inverse=False, return_counts=False, dim=None)

默认参数说明
input: 待处理Tensor
sorted: 是否对处理后的不包含重复元素的Tensor进行升序排列(sorted=True表示进行升序排列,sorted=False并非表示降序排列,这点容易混淆,可以看下面例1)
return_inverse: 是否返回待处理Tensor中每个元素在处理后的无重复的Tensor中所对应的索引(看例2)
return_counts: 是否返回处理后的无重复元素的Tensor中每个元素在处理前Tensor中的统计数量(看例3)
dim: 沿着哪个维度进行unique的处理(待测试)
例1

# 下面三个例子说明当sorted=False时并非按照降序排列
x = torch.tensor([4,0,1,2,1,2,3,5,7])
out = torch.unique(x)
out = torch.unique(x, sorted=False)
--------------------------------------------------------------------------------
tensor([0, 1, 2, 3, 4, 5, 7])
tensor([7, 5, 3, 2, 1, 0, 4])


y = torch.tensor([3,2,4,5,6,7,3,1,3,5,7,8,9,54,1,1,1,0,1])
out = torch.unique(y)
out = torch.unique(y, sorted=False)
--------------------------------------------------------------------------------
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 54])
tensor([ 0, 54,  9,  8,  1,  7,  6,  5,  4,  2,  3])


z = torch.tensor([1,3,5,7,9,0,8,6,4,2,34,5,6,7,8,9,1,3,6,7,8,9,53,2,3])
out = torch.unique(z)
out = torch.unique(z,sorted=False)
-------------------------------------------------------------------------------
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 34, 53])
tensor([53,  2,  4,  6,  8,  0,  9,  7, 34,  5,  3,  1])

例2

x = torch.tensor([4,0,1,2,1,2,3,5,7])
out = torch.unique(x,return_inverse=True)
out = torch.unique(x,sorted=False,return_inverse=True)
--------------------------------------------------------------------------------
(tensor([0, 1, 2, 3, 4, 5, 7]), tensor([4, 0, 1, 2, 1, 2, 3, 5, 6]))
(tensor([7, 5, 3, 2, 1, 0, 4]), tensor([6, 5, 4, 3, 4, 3, 2, 1, 0]))
# 待处理Tensor:[4,0,1,2,1,2,3,5,7]
# 处理后Tensor:[0, 1, 2, 3, 4, 5, 7]
# 待处理Tensor在处理后Tensor中对应的索引:[4, 0, 1, 2, 1, 2, 3, 5, 6]

例3

x = torch.tensor([4,0,1,2,1,2,3,5,7])
out = torch.unique(x,return_counts=True)
--------------------------------------------------------------------------------
(tensor([0, 1, 2, 3, 4, 5, 7]), tensor([1, 2, 2, 1, 1, 1, 1]))
# 处理后Tensor:[0, 1, 2, 3, 4, 5, 7]
# 处理后Tensor在处理前Tensor中的数量:[1, 2, 2, 1, 1, 1, 1]

2.python numpy判断两个数组相等

import numpy as np

# 创建两个数组
array1 = np.array([1, 2, 3])
array2 = np.array([1, 2, 3])
array3 = np.array([4, 5, 6])

# 使用array_equal来比较
equal1 = np.array_equal(array1, array2)  # 应返回True
equal2 = np.array_equal(array1, array3)  # 应返回False

print(equal1)  # 输出: True
print(equal2)  # 输出: False

3.Python numpy 统计数组某一元素的个数/ 统计数组满足条件的元素个数

我们在数据处理的时候,有时需要统计数组中某个元素的个数,如果写个循环就太麻烦了,numpy中有相应的函数进行统计。

3.1 np.sum() 进行统计

np.sum() 有个特性,当数组为[True,False]时会累加True的个数
所以当我们需要计算数组array中值value的个数时,使用语句:np.sum(data == value) 即可
当我们需要计算数组array中大于值value的个数时,使用语句:np.sum(data > value) 即可

实例1 统计等于某元素的个数:

import numpy as np

data=np.array([[1,2,3],[0,1,2],[3,4,5]])
print("查看数组中各位置是否为1 \n",data == 1)

n = np.sum(data == 1)
print("数组中1的个数",n)

输出结果:

查看数组中各位置是否为1 
 [[ True False False]
 [False  True False]
 [False False False]]
数组中1的个数 2

实例2 统计满足条件的元素的个数

import numpy as np

data=np.array([[1,2,3],[0,1,2],[3,4,5]])
n = np.sum(data > 1)
print("数组中元素大于1的个数为",n)

结果

数组中元素大于1的个数为 6

4.如何统计二维或者多维空间/二维数组中重复元素的数量/计数?numpy一行代码就行了

4.1. 问题说明

统计一维数组中重复元素的数量是个常见的问题,那么拓展到二维或者更高维度,这个问题依然是常见的。有什么方法能快速解决这个问题呢?请接着往下看,代码就在下边。

4.2. 解决之道

numpy中的unique可以用来统计重复元素的个数,但是看网上有些资料说只适用于一维数组(如下图)。
在这里插入图片描述
事实果真如此吗?

我使用百度仔细检索发现了一篇很有用的文章,发现上图中说的是错误的,文章里边提到了怎么统计二维空间中重复点的数量。下边展示一下代码:

import numpy as np
a = np.array(
    [
        [1, 0, 0],
        [1, 0, 0],
        [1, 0, 0],
        [2, 3, 4]
    ]
)
unique, unique_counts = np.unique(
    a.view(a.dtype.descr * a.shape[1]),
    return_counts=True
)

运行结果如下图:
在这里插入图片描述
说实话我看不懂view那一行是怎么个意思,但是我大受震撼。原来numpy可以如此强大!

哪位高人懂的可以在评论区指点一下。

4.3. 向原作者致敬

贴出原作图片,。
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到