Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 交叉连接两个向量的元素以生成第三个向量_Python_C++_R_Vector - Fatal编程技术网

Python 交叉连接两个向量的元素以生成第三个向量

Python 交叉连接两个向量的元素以生成第三个向量,python,c++,r,vector,Python,C++,R,Vector,我有2个向量,希望将一个向量分布到另一个向量上,形成第三个向量,如: V1 = (a,b,c) V2 = (d,e,f) 结果: V3 = (ad,ae,af,bd,be,bf,...cf) 'nine total elements 我知道的唯一方法就是循环。我尝试了多种不同的方法来搜索,但找不到“一行代码”的解决方案,以避免循环 如果我错过了,请给我指一下。我可能没有找到正确的搜索参数 如果不可能的话,请不要让我难过,让我知道 如果有答案,请分享。在R: as.vector(sapply(

我有2个向量,希望将一个向量分布到另一个向量上,形成第三个向量,如:

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

V3 = (ad,ae,af,bd,be,bf,...cf) 'nine total elements
我知道的唯一方法就是循环。我尝试了多种不同的方法来搜索,但找不到“一行代码”的解决方案,以避免循环

如果我错过了,请给我指一下。我可能没有找到正确的搜索参数

如果不可能的话,请不要让我难过,让我知道

如果有答案,请分享。

在R:
as.vector(sapply(V1,函数(x)paste0(x,V2))
在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] };
(在上测试。)

谢谢你,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;
}
稍加改进后,它甚至可以用于混合类型:

#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;
}

你没有弄清楚什么是运算
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')

您还可以使用
itertools
模块中的
product()但是上面的似乎更容易。

请先选择一种特定的语言。
ad
和其他语言是两个实数的乘法,两个字符串的串联,加入有序对,还是其他什么?考虑到,
V3
实际上是
V1
V2
(如果矩阵是逐行存储的)并且假设元素是
int
float
double
,您可以查看一下。对于Intels x86体系结构,它使用(或至少可以使用)它是用C++实现的,它对各种语言都有绑定,例如R和Python。谢谢你们的回答。我为我缺乏清晰性表示歉意,但是我应该更具体地说,这三个向量是需要级联的字符串。所以时间和精力并没有完全浪费。@ Migelk77我不理解“不是完全浪费”。道尔顿的Python解决方案确实提到了字符串的并列,以及C++中的并列(第二示例),即使你没有提到实际上是字符串的串接。(我甚至不会排除R中的解决方案,因为它可能依赖于函数(x)
的实际功能,但这只是猜测。)不,我的意思是,在我读帖子之前,我实际上已经弄明白了,所以我担心我浪费了你的时间问了一个我找到解决方案的问题。我讨厌问我应该已经知道或能够推理的问题。我刚开始写东西,知道最终我会扩展到python以外的其他语言,所以我很欣赏ted的答案超出了python的范围。很抱歉给你带来困惑,谢谢你的帮助。也很抱歉我忘了提到我在python中工作。我必须放慢速度,更多地关注细节。哈哈。我似乎无法克服角色缺陷。
(14, 22, 26, 21, 33, 39, 35, 55, 65)
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')