我在python中编码。我想给一个numpy数组,例如[0, 1, 0, 1, 1, 1, 0, 0, 0, 1]
一个数字形式的特定一对一标记,这样我就可以使用这样一个唯一标记来区分/搜索它们。在一篇论文中,我发现了以下功能的想法:
def tag (v):
val = 0
for i in range(len(v)):
val += math.sqrt(100 * (i + 1) + 3) * v[i]
return val
给每个数组v一个特定的标签。现在我有一些问题:
[0, 0, 0]
获得与[0, 0, 0, 0]
不同的标记有关如何推翻此问题的任何解决方案或想法?任何帮助是极大的赞赏。谢谢!
答案 0 :(得分:0)
您可以将数组视为二进制数,根据数组中的0和1创建一个整数。对于具有相同项目和不同长度的数组的重复结果的拒绝,您可以将结果与数组的大小相加。
In [74]: def create_flag(arr):
....: size = arr.size
....: return arr.dot(2**np.arange(size)[::-1]) + size
....:
演示:
In [74]: arr = np.array([0, 1, 0, 1, 1, 1, 0, 0, 0, 1])
In [75]: create_flag(arr)
Out[75]: 379
In [76]: arr = np.array([0, 0])
In [77]: create_flag(arr)
Out[77]: 2
In [78]: arr = np.array([1, 0])
In [79]: create_flag(arr)
Out[79]: 4
In [81]: arr = np.array([0])
In [82]: create_flag(arr)
Out[82]: 1
答案 1 :(得分:0)
同意@Kasramvd上面显示的二进制转换方法,但认为该函数在以下用例中失败:
arr1 = np.array( [0,0] ) # create_flag returns '2'
arr2 = np.array( [1] ) # create_flag returns '2'
因为你不能盲目地将指数大小添加到指数结果中。恕我直言,你可以使用一个2D矩阵(长度为len(数组)的数组大小和二进制值作为你的查找。最后你有这样的东西:
# Modified binary value function
def get_binary_value(arr):
return arr.dot(2**np.arange(arr.size)[::-1])
# Then store
binVal = get_binary_value( my_array )
arrLen = len( my_array )
mat[arrLen][binVal] = my_array # mat is of numpy 2D array and pre-defined dimensions
这有一些明显的警告:
答案 2 :(得分:0)
为什么不散列数组?
const succ = n => f => B(f)(n(f));
这将是一个有符号整数。如果需要与数字相关的数字属性,请考虑数组的最大总和有多大。将数组的总和添加到哈希值的 10 次方,足以避免丢失哈希唯一性的位(符号除外,这是保持排序顺序所必需的):
import Link from "next/link";
import Layout from "../components/Layout";
import useSWR from "swr";
import { INPUT_VALUES } from "./formBuilder";
import { useQuery } from "@apollo/client";
import React, { useEffect, useState } from "react";
import styled from "styled-components";
import { RiEdit2Fill } from "react-icons/ri";
import { useRouter } from "next/router";
const Wrap = styled.div``;
const Grid = styled.div`
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 225px));
background: lightgrey;
/* grid-template-columns: 1fr 1fr 1fr 1fr; */
`;
const RowItem = styled.p`
&:hover {
cursor: pointer;
background: lightyellow;
}
`;
const fetcher = (url) => fetch(url).then((r) => r.json());
const HoverableRow = ({ rowEdit, d, i }) => {
const [editState, setEditState] = useState(false);
return (
<RowItem
onClick={() => rowEdit(d.ref["@ref"].id)}
onMouseEnter={setEditState(true)}
onMouseLeave={setEditState(false)}
className="test"
>
<span>
{Object.values(d.data)[i] ? Object.values(d.data)[i] : "null"}
</span>
<span>
{editState ? (
<a>
<RiEdit2Fill />
</a>
) : (
<a></a>
)}
</span>
</RowItem>
);
};
const Value = ({ data, i }) => {
const router = useRouter();
const rowEdit = (id) => {
console.log(id);
router.push(`rowEdit/${id}`);
};
return (
<div>
{data ? (
data.map((d) => (
<div key={`${Object.values(d.data)[i]}-${i}`}>
<HoverableRow {...{ rowEdit, d, i }} />
{/* <p>{d.ref["@ref"].id}</p> */}
</div>
))
) : (
<>
<p>loading</p>
</>
)}
</div>
);
};
const Home = () => {
const { data, error } = useSWR("/api/data", fetcher);
const { loading, error: inputError, data: inputNames } = useQuery(
INPUT_VALUES
);
const [inputDataState, setInputDataState] = useState([]);
useEffect(() => {
const inputData = inputNames?.allFormInputVals?.data;
setInputDataState(inputData);
}, [inputNames]);
//console.log(inputDataState);
//console.log(data);
data?.map((d, i) => {
console.log(d);
});
return (
<Layout>
<h1>Welcome to your Catalog</h1>
<Grid>
{inputDataState?.map((item, i) => {
return (
<Wrap key={item._id}>
<div>
<h2>{item.name}</h2>
</div>
<form>
<Value i={i} data={data} />
</form>
</Wrap>
);
})}
</Grid>
</Layout>
);
};
export default Home;
这第二个技巧仅适用于 python3 或更高版本,其中整数未绑定。