我有一个数组,其中包含一个小数点后的数字。小数只能是1、2或3(由用户设置,因此不需要算法)。我想创建一个函数,该函数排除数组中不包含所有三个小数的元素。
例如,当考虑以下数组并预期输出时:
a = np.array([1.1, 1.3, 1.2, 2.1, 2.2])
b = np.array([1.3, 1.2, 1.1, 7.3, 7.1, 8.1, 8.2, 8.3])
#desired output
a_usefull = [1.1, 1.3, 1.2]
b_usebull = [1.3, 1.2, 1.1, 8.1, 8.2, 8.3]
排除了 a 中的元素2.1
和2.2
,因为两者均缺少小数点.3。元素7.3
和7.1
被排除,因为缺少十进制.2。请注意,原始数组的顺序是导入的,因此例如[1.3, 1.1, 1.2]
应该以{{1}}
另一个条件是,例如[1.3, 1.1, 1.2]
的输出应与所看到的完全相同。因此,例如,它是[1,1,2,1,2,2],不应为[1,1,1,2,2,2]。顺序不应更改。
我当时正在考虑对数组中的所有元素进行铺底,并首先对其进行计数。但是,代码应在函数中给出。有人可以帮忙吗?
[1.1, 1.3, 2.1, 2.2, 1.2, 2.3]
谢谢!
答案 0 :(得分:1)
简单而简短
a = np.array([1.1, 1.2, 1.3, 2.1, 2.2])
def remove(id):
useful_elements=np.array([])
for x in np.unique(a.astype(int)):
if((x+.1 in a) and (x+.2 in a) and (x+.3 in a)):
useful_elements=np.append(useful_elements,(x+.1,x+.2,x+.3))
return useful_elements
答案 1 :(得分:0)
您可以首先从列表中找到数字的所有整数部分,从中找出一个列表,然后检查更大的列表中是否存在包含所有三个小数的列表
def func(li):
res = []
int_li = []
#Create a list for integers in the input list
for item in li:
int_item = int(item)
if int_item not in int_li:
int_li.append(int_item)
#Iterate through the list for integers
for num in int_li:
#Create list with all 3 decimals
check_list = [(num + .1*i) for i in range(1, 4)]
dec_list = []
#Iterate through the bigger list
for number in li:
#Compare the integer part of element with given integer
if num == int(number):
dec_list.append(number)
#If the found decimal list is present in bigger list with 3 decimals
if sorted(dec_list) == sorted(check_list):
#Add it to result and move on to next item
res.extend(dec_list)
break
#Return result
return res
print(func([1.1, 1.2, 1.3, 2.1, 2.2]))
print(func([1.3, 1.2, 1.1, 7.3, 7.1, 8.1, 8.2, 8.3]))
输出将为
[1.1, 1.2, 1.3]
[1.3, 1.2, 1.1, 8.1, 8.2, 8.3]
答案 2 :(得分:0)
这是我的看法:
# your code goes here
import numpy as np
import math
a = np.array([1.1, 1.2, 1.3, 2.1, 2.2])
b = np.array([1.1, 1.2, 1.3, 7.3, 7.1, 8.1, 8.2, 8.3])
def numpy_filter(arr):
required_decimals = {1, 2, 3}
lst = arr.tolist()
numbers = { math.floor(x) for x in lst }
fmap = { n: { x for x in lst if math.floor(x) == n } for n in numbers }
toReturn = []
for n, decs in fmap.items():
target_set = { n + x * 0.1 for x in required_decimals }
if decs == target_set:
toReturn.extend(target_set)
return np.array(toReturn)
#desired output
print(numpy_filter(a))
print(numpy_filter(b))
a_usefull = [1.1, 1.2, 1.3]
b_usebull = [1.1, 1.2, 1.3, 8.1, 8.2, 8.3]
首先,我提取基础列表以更轻松地对其进行管理
lst = arr.tolist()
然后我提取集合中的所有整数部分以避免重复
numbers = { math.floor(x) for x in lst }
此后,我在地图中划分了原始列表,为每个整数映射了原始列表中包含的元素
fmap = { n: { x for x in lst if math.floor(x) == n } for n in numbers }
此后,我解析了地图的所有元素,以查找列表中的元素与应具有的元素之间的差异。将地图的任何人添加到返回的新列表中。
toReturn = []
for n, decs in fmap.items():
target_set = { n + x * 0.1 for x in required_decimals }
if decs == target_set:
toReturn.extend(target_set)