2个向量的交叉连接元素产生第三个

时间:2017-06-16 13:15:07

标签: python c++ r vector

我有2个向量,想要在另一个之间分配一个,形成第三个向量,如:

V1 = (a,b,c)
V2 = (d,e,f)

结果:

V3 = (ad,ae,af,bd,be,bf,...cf) 'nine total elements

我知道如何做的唯一方法是循环。我尝试过多种不同的搜索方式,而且无法找到一行代码'解决方案,以避免循环。

如果我错过了,请指出。我可能找不到合适的搜索参数。

如果不可能,请免除我的痛苦,让我知道:,,,(。

如果有答案,请分享。

3 个答案:

答案 0 :(得分:1)

您无法明确ab的操作含义。我假设你想要将两个实数相乘。

在Python中,您可以使用理解。这是一个完整的代码段。

v1 = (2, 3, 5)
v2 = (7, 11, 13)
v3 = tuple(x * y for x in v1 for y in v2)

v3的值是

(14, 22, 26, 21, 33, 39, 35, 55, 65)

如所希望的那样。如果你想要一个Python列表,代码看起来更容易:使用

v3 = [x * y for x in v1 for y in v2]

很明显如何将操作更改为连接或其他任何需要的操作。以下是串联字符串的示例代码:

v1 = ('a', 'b', 'c')
v2 = ('d', 'e', 'f')
v3 = tuple(x + y for x in v1 for y in v2)

导致

('ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf')

您还可以使用product()模块中的itertools(我在此答案的第一个版本中使用过),但上述内容似乎更容易。

答案 1 :(得分:0)

在R中:
as.vector(sapply(V1, function(x) paste0(x, V2)))

答案 2 :(得分:0)

在C ++中:

std::vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };

......但是,我通常会将它格式化为多行。

作为MCVE:

#include <iostream>
#include <vector>
using namespace std;

template <typename ELEM>
ostream& operator << (ostream &out, const vector<ELEM> &vec)
{
  const char *sep = "{ ";
  for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; }
  return out << " }";
}

int main()
{
  vector<double> v1{ 1.0, 2.0, 3.0 }, v2{ 4.0, 5.0, 6.0 };
  // in one line:
  vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
  // output:
  cout << v3 << endl;
  // done
  return 0;
}

输出:

{ 4, 5, 6, 8, 10, 12, 12, 15, 18 }

(经ideone测试。)

谢谢Rory Daulton的灵感。在C ++中,我也可以这样做:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string operator*(const string &str1, const string &str2)
{
  return str1 + str2;
}

template <typename ELEM>
ostream& operator << (ostream &out, const vector<ELEM> &vec)
{
  const char *sep = "{ ";
  for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; }
  return out << " }";
}

int main()
{
  vector<string> v1{ "a", "b", "c" }, v2{ "d", "e", "f" };
  // in one line:
  vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
  // output:
  cout << v3 << endl;
  // done
  return 0;
}

输出:

{ ad, ae, af, bd, be, bf, cd, ce, cf }

经过一些改进后,它甚至适用于混合类型:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string operator*(const string &arg1, int arg2)
{
  string ret; for (int i = 0; i < arg2; ++i) ret += arg1;
  return ret;
}

template <typename ELEM>
ostream& operator << (ostream &out, const vector<ELEM> &vec)
{
  const char *sep = "{ ";
  for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; }
  return out << " }";
}

int main()
{
  vector<string> v1{ "a", "b", "c" }; vector<int> v2{ 1, 2, 3 };
  // in one line:
  vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
  // output:
  cout << v3 << endl;
  // done
  return 0;
}

输出:

{ a, aa, aaa, b, bb, bbb, c, cc, ccc }