python中numpy数组是否被破坏及元素的去重操作

本文详细解析了Python中数组操作的影响,包括切片与直接修改元素对原数组的影响,强调了数据安全的重要性。同时,介绍了两种对一维和二维数组进行去重的方法,包括使用numpy的unique函数及其局限性,以及通过转换为虚数和利用set实现的创新解决方案。
摘要由CSDN通过智能技术生成

1、判断数组是否被破坏

1、描述
  在下面的代码中,采用两种方式更改新数组中的数据,然后查看原来的数组中的数据是否被破坏。
2、代码

import numpy as np

# 切片数据是原数组的一个视图,与原数组共享内容空间,可以直接修改元素值
a = np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
print(a)

print("---------------")
# 方式1:使用对应坐标的方法更改数据
i = np.arange(0, 10, 2)
b = a[i]
# b的元素更改,a中元素不受影响。可以理解为b为重新生成的数组。
print("type(b)", type(b))
b[2] = 10
# [ 0  2 10  6  8]
print(b)
# [0 1 2 3 4 5 6 7 8 9]
print(a)

print("---------------")
# 方式1:使用切片的方法更改数据
b2 = a[2:5]
# b2的元素更改,a中元素会受影响
b2[0] = 200
# [200   3   4]
print(b2)
# 通过切片获得的数据的数组b再重新赋值后,更改了原来数组a的值。
# 在实践中,应该注意原始数据是否被破坏
# [  0   1 200   3   4   5   6   7   8   9]
print(a)

2、元素去重

1、描述
  下面的代码是对一维数组和二维数组去重的讨论。
2、代码

# @Time : 2020/12/8 16:41
# @Description :数组去重

import numpy as np

print("--------一维数组的去重操作---------")
# 直接使用库函数
a = np.array((1, 2, 3, 4, 5, 5, 7, 3, 2, 2, 8, 8))
# [1 2 3 4 5 5 7 3 2 2 8 8]
print('原始数组:', a)

# # 使用库函数unique
b = np.unique(a)
#  [1 2 3 4 5 7 8]
print('去重后:', b)

print("--------二维数组的去重操作---------")
c = np.array(((1, 2), (3, 4), (5, 6), (1, 3), (3, 4), (7, 6)))
#  [[1 2]
#  [3 4]
#  [5 6]
#  [1 3]
#  [3 4]
#  [7 6]]
print(u'二维数组:\n', c)
# 使用unique对二维数组去重,并不是原来的效果。
# [1 2 3 4 5 6 7]
print('去重后:', np.unique(c))

print("-----------------")
# 方案1:转换为虚数
# x = r + i * 1j
x = c[:, 0] + c[:, 1] * 1j
# [1.+2.j 3.+4.j 5.+6.j 1.+3.j 3.+4.j 7.+6.j]
print('转换成虚数:', x)
# [1.+2.j 1.+3.j 3.+4.j 5.+6.j 7.+6.j]
print('虚数去重后:', np.unique(x))
# (array([1.+2.j, 1.+3.j, 3.+4.j, 5.+6.j, 7.+6.j]), array([0, 3, 1, 2, 5], dtype=int64))
# return_index的含义是未重复数据的索引
print(np.unique(x, return_index=True))
idx = np.unique(x, return_index=True)[1]
# [0 3 1 2 5]
print("idx", idx)
#  [[1 2]
#  [1 3]
#  [3 4]
#  [5 6]
#  [7 6]]
print('二维数组去重:\n', c[idx])

print("-----------------")
# 方案2推荐使用:利用set
print('去重方案2:\n', np.array(list(set([tuple(t) for t in c]))))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值