给出一个numpy数组的零和不同长度的特定标记

时间:2017-05-21 11:31:08

标签: python arrays python-2.7 numpy tags

我在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一个特定的标签。现在我有一些问题:

  1. 我不太明白如何提出这样的公式
  2. 这个算法是针对数组提出的,这些数组可以是所有自然数,而不仅仅是1和0,所以也许它可以更有效地用于我的目的
  3. 我程序中的数组有不同的长度,所以我最多需要这些数组之间不同的算法,以便[0, 0, 0]获得与[0, 0, 0, 0]不同的标记
  4. 有关如何推翻此问题的任何解决方案或想法?任何帮助是极大的赞赏。谢谢!

3 个答案:

答案 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

这有一些明显的警告:

  1. 使用数组(矩阵)而不是奇异值。如果您需要,可以使用许多方法从种子创建唯一值。
  2. 由于我们使用十进制值作为键(意味着数组需要具有相等/更大的长度),因此数组大小和1的数量增加是低效的。

答案 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 或更高版本,其中整数未绑定。